Как я могу поймать «захватывающую фатальную ошибку» в подсказке типа PHP?

Я пытаюсь реализовать Type Hinting PHP5 на одном из моих классов,

class ClassA { public function method_a (ClassB $b) {} } class ClassB {} class ClassWrong{} 

Правильное использование:

 $a = new ClassA; $a->method_a(new ClassB); 

ошибка изготовления:

 $a = new ClassA; $a->method_a(new ClassWrong); 

Обрезаемая фатальная ошибка: аргумент 1, переданный ClassA :: method_a (), должен быть экземпляром ClassB, экземпляр ClassWrong, данный …

Могу ли я узнать, можно ли поймать эту ошибку (так как она говорит «захватывающе»)? и если да, то как?

Спасибо.

Related of "Как я могу поймать «захватывающую фатальную ошибку» в подсказке типа PHP?"

Обновление: в php 7. Это больше не опасная фатальная ошибка. Вместо этого возникает «исключение». «Исключение» (в кавычках), которое не является производным от Exception, а Error ; он по-прежнему является Throwable и может обрабатываться с помощью обычного блока try-catch. см. https://wiki.php.net/rfc/throwable-interface

Например

 <?php class ClassA { public function method_a (ClassB $b) { echo 'method_a: ', get_class($b), PHP_EOL; } } class ClassWrong{} class ClassB{} class ClassC extends ClassB {} foreach( array('ClassA', 'ClassWrong', 'ClassB', 'ClassC') as $cn ) { try{ $a = new ClassA; $a->method_a(new $cn); } catch(Error $err) { echo "catched: ", $err->getMessage(), PHP_EOL; } } echo 'done.'; 

печать

 catched: Argument 1 passed to ClassA::method_a() must be an instance of ClassB, instance of ClassA given, called in [...] catched: Argument 1 passed to ClassA::method_a() must be an instance of ClassB, instance of ClassWrong given, called in [...] method_a: ClassB method_a: ClassC done. 

Старый ответ для версий pre-php7:
http://docs.php.net/errorfunc.constants говорит:

E_RECOVERABLE_ERROR (целое число)
Ловкая ошибка. Он указывает, что произошла, вероятно, опасная ошибка, но не оставила двигатель в неустойчивом состоянии. Если ошибка не попадает в определяемый пользователем дескриптор (см. Также set_error_handler () ), приложение прерывается, так как это был E_ERROR.

см. также: http://derickrethans.nl/erecoverableerror.html

например

 function myErrorHandler($errno, $errstr, $errfile, $errline) { if ( E_RECOVERABLE_ERROR===$errno ) { echo "'catched' catchable fatal error\n"; return true; } return false; } set_error_handler('myErrorHandler'); class ClassA { public function method_a (ClassB $b) {} } class ClassWrong{} $a = new ClassA; $a->method_a(new ClassWrong); echo 'done.'; 

печать

 'catched' catchable fatal error done. 

edit: Но вы можете «сделать» это исключение, с которым вы можете справиться с блоком try-catch

 function myErrorHandler($errno, $errstr, $errfile, $errline) { if ( E_RECOVERABLE_ERROR===$errno ) { echo "'catched' catchable fatal error\n"; throw new ErrorException($errstr, $errno, 0, $errfile, $errline); // return true; } return false; } set_error_handler('myErrorHandler'); class ClassA { public function method_a (ClassB $b) {} } class ClassWrong{} try{ $a = new ClassA; $a->method_a(new ClassWrong); } catch(Exception $ex) { echo "catched\n"; } echo 'done.'; 

см. http://docs.php.net/ErrorException