Хорошо, у меня есть проблема с catch
error
или же exception
когда я звоню undefined
function
У меня есть метод для вызова функции с двумя параметрами (bool, function)
private function invoking($hdr = true, $fnc) {
if(is_callable($fnc)) {
if($hdr) {
$this->load_header();
}
try {
$fnc->__invoke();
} catch(Exception $er) {
echo "Something went wrong. ".$er;
}
} else {
echo "function not callable";
}
}
Но у меня есть проблема, чтобы поймать ошибку внутри $fnc
,
$this->invoking(true, function() {
undefinedfunction();
// for example i called this, which the function doesnt exist
});
Но кажется, что улов не работает к тому, что внутри я __invoke()
что я должен сделать, чтобы поймать ошибку внутри invoked
функционировать?
Спасибо за любой совет
Но похоже, что улов не работает к тому, что внутри я __invoke ()
Это не работает, потому что это бросает Fatal error
который не может быть обработан с помощью Exception
учебный класс. А до PHP 7 почти невозможно было отследить подобные ошибки.
В PHP 7:
Большинство ошибок теперь сообщается с помощью исключения ошибок
Читать дальше на Ошибки в PHP 7
Так что, если ваша версия php> = PHP 7, вы можете просто сделать это следующим образом
try {
$fnc->__invoke();
} catch(Error $er) { // Error is the base class for all internal PHP errors
echo $er->getMessage();
}
Вы выполняете неопределенную функцию перед ее передачей
вам нужно делать:
$this->invoking(true,'undefinedfunction');
Тогда __invoke не будет работать со строкой, поэтому вам нужно использовать
call_user_func($fnc);
вместо.
Для вызова функций, имеющих аргументы, передайте аргументы в виде массива в вашу функцию, а затем
call_user_func_array
private function invoking($hdr = true, $fnc, $args=Array())
...
call_user_func_array($fnc, $args);
...
$this->invoking(true,'print_r', Array("Hi there It Works"));
Итак, ваш окончательный код будет:
private function invoking($hdr = true, $fnc, $args=Array()) {
if(is_callable($fnc)) {
if($hdr) {
$this->load_header();
}
try {
call_user_func_array($fnc, $args);
} catch(Exception $er) {
echo "Something went wrong. ".$er;
}
} else {
echo "function not callable";
}
}
Тесты:
$this->invoking(true,'undefinedfunction');
$this->invoking(true,'print_r', Array("Hi there It Works"));