Как отловить ошибку из вызванной функции?

Хорошо, у меня есть проблема с 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 функционировать?

Спасибо за любой совет

-1

Решение

Но похоже, что улов не работает к тому, что внутри я __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();
}
1

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

Вы выполняете неопределенную функцию перед ее передачей
вам нужно делать:

$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"));

0

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