diff options
Diffstat (limited to 'lib/querypath/src/QueryPath/ParseException.php')
-rw-r--r-- | lib/querypath/src/QueryPath/ParseException.php | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/lib/querypath/src/QueryPath/ParseException.php b/lib/querypath/src/QueryPath/ParseException.php new file mode 100644 index 0000000..7da7beb --- /dev/null +++ b/lib/querypath/src/QueryPath/ParseException.php @@ -0,0 +1,44 @@ +<?php +/** + * @file + * Query path parsing exception. + */ + +namespace QueryPath; + +/** + * Exception indicating that a parser has failed to parse a file. + * + * This will report parser warnings as well as parser errors. It should only be + * thrown, though, under error conditions. + * + * @ingroup querypath_core + */ +class ParseException extends \QueryPath\Exception { + const ERR_MSG_FORMAT = 'Parse error in %s on line %d column %d: %s (%d)'; + const WARN_MSG_FORMAT = 'Parser warning in %s on line %d column %d: %s (%d)'; + // trigger_error + public function __construct($msg = '', $code = 0, $file = NULL, $line = NULL) { + + $msgs = array(); + foreach(libxml_get_errors() as $err) { + $format = $err->level == LIBXML_ERR_WARNING ? self::WARN_MSG_FORMAT : self::ERR_MSG_FORMAT; + $msgs[] = sprintf($format, $err->file, $err->line, $err->column, $err->message, $err->code); + } + $msg .= implode("\n", $msgs); + + if (isset($file)) { + $msg .= ' (' . $file; + if (isset($line)) $msg .= ': ' . $line; + $msg .= ')'; + } + + parent::__construct($msg, $code); + } + + public static function initializeFromError($code, $str, $file, $line, $cxt) { + //printf("\n\nCODE: %s %s\n\n", $code, $str); + $class = __CLASS__; + throw new $class($str, $code, $file, $line); + } +} |