PHP обрабатывает нулевую обработку исключением

Есть ли способ, которым я могу сказать PHP выдать исключение, когда я пытаюсь получить доступ к члену или методу на null объект?

Например.:

$x = null;
$x->foo = 5; // Null field access
$x->bar(); // Null method call

Прямо сейчас я получаю только следующие ошибки, которые не очень хорошо обрабатываются:

PHP Notice:  Trying to get property of non-object in ...
PHP Warning:  Creating default object from empty value in ...
PHP Fatal error:  Call to undefined method stdClass::bar() in ...

Я хотел бы, чтобы вместо этого было выброшено конкретное исключение. Это возможно?

6

Решение

Вы можете превратить ваши предупреждения в исключения, используя set_error_handler () поэтому, когда появляется предупреждение, оно генерирует исключение, которое вы можете перехватить в блоке try-catch.

Неустранимые ошибки не могут быть превращены в исключения, они предназначены для php, чтобы остановить как можно скорее. однако мы можем изящно обработать ошибку плода, выполнив некоторую последнюю обработку, используя register_shutdown_function ()

<?php

//Gracefully handle fatal errors
register_shutdown_function(function(){
$error = error_get_last();
if( $error !== NULL) {
echo 'Fatel Error';
}
});

//Turn errors into exceptions
set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});

try{
$x = null;
$x->foo = 5; // Null field access
$x->bar(); // Null method call
}catch(Exception $ex){
echo "Caught exception";
}
2

Другие решения

Добавьте этот код в файл, который включен или выполняется перед чем-либо еще:

set_error_handler(
function($errno, $errstr, $errfile, $errline) {
throw new \ErrorException($errstr, $errno, 1, $errfile, $errline);
}
);
1

Попробуйте этот код, чтобы перехватить все ошибки:

<?php
$_caughtError = false;

register_shutdown_function(
// handle fatal errors
function() {
global $_caughtError;
$error = error_get_last();
if( !$_caughtError && $error ) {
throw new \ErrorException($error['message'],
$error['type'],
2,
$error['file'],
$error['line']);
}
}
);

set_error_handler(
function($errno, $errstr, $errfile, $errline) {
global $_caughtError;
$_caughtError = true;
throw new \ErrorException($errstr, $errno, 1, $errfile, $errline);
}
);

Это должно быть выполнено или включено перед другим кодом.

Вы также можете реализовать Singleton, чтобы избежать глобальных переменных или позволить ему генерировать два исключения, если вы не возражаете.

1

Правильный ответ должен быть: НЕТ. Это невозможно в любой версии PHP.

0
По вопросам рекламы [email protected]