78 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			78 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | Error handling | ||
|  | ============== | ||
|  | 
 | ||
|  | Errors during parsing or analysis are represented using the `PhpParser\Error` exception class. In addition to an error | ||
|  | message, an error can also store additional information about the location the error occurred at. | ||
|  | 
 | ||
|  | How much location information is available depends on the origin of the error and how many lexer attributes have been | ||
|  | enabled. At a minimum the start line of the error is usually available. | ||
|  | 
 | ||
|  | Column information | ||
|  | ------------------ | ||
|  | 
 | ||
|  | In order to receive information about not only the line, but also the column span an error occurred at, the file | ||
|  | position attributes in the lexer need to be enabled: | ||
|  | 
 | ||
|  | ```php | ||
|  | $lexer = new PhpParser\Lexer(array( | ||
|  |     'usedAttributes' => array('comments', 'startLine', 'endLine', 'startFilePos', 'endFilePos'), | ||
|  | )); | ||
|  | $parser = new PhpParser\Parser($lexer); | ||
|  | 
 | ||
|  | try { | ||
|  |     $stmts = $parser->parse($code); | ||
|  |     // ... | ||
|  | } catch (PhpParser\Error $e) { | ||
|  |     // ... | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | Before using column information its availability needs to be checked with `$e->hasColumnInfo()`, as the precise | ||
|  | location of an error cannot always be determined. The methods for retrieving column information also have to be passed | ||
|  | the source code of the parsed file. An example for printing an error: | ||
|  | 
 | ||
|  | ```php | ||
|  | if ($e->hasColumnInfo()) { | ||
|  |     echo $e->getRawMessage() . ' from ' . $e->getStartLine() . ':' . $e->getStartColumn($code) | ||
|  |         . ' to ' . $e->getEndLine() . ':' . $e->getEndColumn($code); | ||
|  | } else { | ||
|  |     echo $e->getMessage(); | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | Both line numbers and column numbers are 1-based. EOF errors will be located at the position one past the end of the | ||
|  | file. | ||
|  | 
 | ||
|  | Error recovery | ||
|  | -------------- | ||
|  | 
 | ||
|  | > **EXPERIMENTAL**
 | ||
|  | 
 | ||
|  | By default the parser will throw an exception upon encountering the first error during parsing. An alternative mode is | ||
|  | also supported, in which the parser will remember the error, but try to continue parsing the rest of the source code. | ||
|  | 
 | ||
|  | To enable this mode the `throwOnError` parser option needs to be disabled. Any errors that occurred during parsing can | ||
|  | then be retrieved using `$parser->getErrors()`. The `$parser->parse()` method will either return a partial syntax tree | ||
|  | or `null` if recovery fails. | ||
|  | 
 | ||
|  | A usage example: | ||
|  | 
 | ||
|  | ```php | ||
|  | $parser = new PhpParser\Parser(new PhpParser\Lexer, array( | ||
|  |     'throwOnError' => false, | ||
|  | )); | ||
|  | 
 | ||
|  | $stmts = $parser->parse($code); | ||
|  | $errors = $parser->getErrors(); | ||
|  | 
 | ||
|  | foreach ($errors as $error) { | ||
|  |     // $error is an ordinary PhpParser\Error | ||
|  | } | ||
|  | 
 | ||
|  | if (null !== $stmts) { | ||
|  |     // $stmts is a best-effort partial AST | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | The error recovery implementation is experimental -- it currently won't be able to recover from many types of errors. |