перехват ошибок

Поясните пожалуйста за работу с ошибками в php

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

Вот эта конструкция работает как мне нужно, при запуске я получаю то, что ожидаю.

function errorHandler($errno, $errstr, $errfile, $errline){
  echo 'номер '.$errno.', сообщение '.$errstr.', файл '.$errfile.', позиция '.$errline;
  return true;
}

set_error_handler('errorHandler', E_ALL);

$a = array(2, "foo"+2);
print_r($a);

Но стоит положить поломанный массив внутрь функции.

...

function test($weight){
  $a = array(2, "foo"+2);
  print_r($a);
}      

Как я начинаю получать при вызове функции test стандартный вывод информации об ошибке

Warning: A non-numeric value encountered in D:\web\OpenServer\OSPanel\domains\zinger-eat.ru\function.php on line 117

Если я правильно понимаю функция set_error_handler должна перехватывать появляющиеся ошибки (кроме фатальных), но она не перехватывает ошибки, возникающие в функциях?

Окей, чтобы ловить ошибки с помощью try/catch нужно генерить исключения в блоке try и обрабатывать их в блоке catch, но я ведь не знаю какая может возникнуть именно ошибка при выволнении функции, я и рассчитываю, что перехватчик ошибок мне расскажет, а не я буду продумывать и прописывать все исключения для каждой ситуации.

В общем я немного взволнован, что не могу найти решение и понять как работать с ошибками.

UPD: После комментария splash58 я понял, что set_error_handler все же перехватывает ошибки корректно и внутри функций, однако в моем проекте проблема сохраняется. Такой код работает как надо

function errorHandler($errno, $errstr, $errfile, $errline) {
  echo 'номер '.$errno.
  ', сообщение '.$errstr.
  ', файл '.$errfile.
  ', позиция '.$errline;
  return true;
}

set_error_handler('errorHandler', E_ALL);

function test() {
  $a = array(2, "foo" + 2);
  print_r($a);
}

test();

Но в своем проекте я с помощью ajax обращаюсь к файлу php, где у меня написано несколько функций и вызываю нужную мне функцию с помощью call_user_func_array. В этом случае ошибка, возникшая в этой функции, не перехватывается set_error_handler. К сожалению не знаю как предоставить пример из песочницы где можно было бы разместить и Php часть и javascript, все до чего я додумался это скрин с кусками кода, который я сваял, прости господи, в power point

https://ibb.co/0DXNqnx

Может сообществу будет достаточно этой скудной информации, чтобы указать в чем у меня проблема, почему ошибки не перехватываются.

UPD2: Проблему удалось решить, поместив set_error_handler внутрь обрабатываемой функции. Видимо так придется поступать с каждой функцией внутри файла function.php, где я хочу перехватывать ошибки.


Ответы (0 шт):