2016-02-08 5 views
4

Недавно перенесено на php7. Следующее сообщение об ошибке:Обработка ошибок и исключений в php7

argument 1 passed to MyClass\Throwable::exceptionHandler() must be an instance of Exception, instance of Error given 

И соответствующий класс

namespace MyClass; 

class Throwable 
{ 
    public function exceptionHandler(\Exception $exception) 
    { 
     //logic here 
    } 
} 

Как указано в docs

большинство ошибок теперь сообщается, бросая исключения ошибок.

Означает ли это, что я должен предоставить экземпляр Error или даже более общий Throwable к обработчику исключений?

+1

взглянуть на https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/ это может помочь вам –

ответ

2

Errors и Exceptions оба варианта: Throwable однако Ошибки не распространяются на Exception.

Поэтому ваш ExceptionHandler должен принять объект типа Throwable, чтобы принять Errors.

Простейшее исправление это, хотя вы можете захотеть переименовать $ exception, чтобы было ясно.

namespace MyClass; 

class Throwable 
{ 
    public function exceptionHandler(\Throwable $exception) 
    { 
     //logic here 
    } 
} 

Примечание: Новый Error класс не должен быть confussed с ErrorException который classicly был использован в качестве устройства для включения PHP 5 ошибок в Exception объектов с symantic смыслом.

http://php.net/manual/en/class.error.php

+0

Оба 'Errors' и' Исключения 'дети 'Throwable'; хорошо, если бы я переключился на ваше решение, какая разница между «ошибкой» и «исключением»? И 'set_exception_handler' теперь предоставляет объект' Error'? Тогда что означает «Исключение» и как они обрабатываются? – sitilge

+0

Если вы хотите специально обрабатывать исключение, а не ошибку, вы всегда можете выполнить 'if ($ throwable instanceof \ Exception) {...}'. Мне любопытно, почему вы хотели бы иметь дело с ними по-другому в этот момент? :) – DanielM

+0

вы правы. Это было бы предпочтительным решением. – sitilge

Смежные вопросы