в ответ на принятый ответ я предложил (возможно) лучший способ обработки исключений внутри __toString()
:
public function __toString()
{
try {
// ... do some stuff
// and try to return a string
$string = $this->doSomeStuff();
if (!is_string($string)) {
// we must throw an exception manually here because if $value
// is not a string, PHP will trigger an error right after the
// return statement, thus escaping our try/catch.
throw new \LogicException(__CLASS__ . "__toString() must return a string");
}
return $string;
} catch (\Exception $exception) {
$previousHandler = set_exception_handler(function (){
});
restore_error_handler();
call_user_func($previousHandler, $exception);
die;
}
}
Предполагается, что определен обработчик исключений, что имеет место в большинстве сред. Как и в случае метода trigger_error
, выполнение этого действия не подойдет для цели try..catch , но все же это намного лучше, чем вывод дампа с помощью echo
Кроме того, многие фреймворки преобразуют ошибки в исключения, поэтому trigger_error
все равно не будет работать.
В качестве дополнительного бонуса вы получите полную трассировку стека, как с обычными исключениями, так и с обычным поведением dev-production вашего фреймворка.
Очень хорошо работает в Laravel, и я уверен, что он будет работать практически во всех современных PHP-фреймворках.
Снимок экрана:
note : в этом примере output()
вызывается методом __toString()
.