error_get_last () и пользовательский обработчик ошибок

odbc_errormsg не сообщает сообщения об ошибках от odbc_execute так, как предполагалось. Это просто выдает предупреждение. Поэтому я был вынужден написать хак для анализа сообщения об ошибке через error_get_last .

Я использую set_error_handler и error_get_last возвращает NULL , если только я:

  1. не отключу свой обработчик ошибок,

  2. или не верну ЛОЖЬ .

Я полагаю, это связано с тем, что встроенный обработчик ошибок PHP заботится о том, чтобы где-то сохранить подробности ошибки, чтобы их можно было получить позже.

Есть ли способ имитировать такое поведение в моем пользовательском обработчике ошибок, чтобы error_get_last () можно было использовать в обычном режиме?

Обратите внимание, что я уже знаю несколько способов получить информацию об ошибке в любое время. У меня вопрос, как сделать error_get_last пригодным для использования.


Обновление: Думаю, лучше выложить код.

PHP имеет error_get_last () , что позволяет сделать это:

@fopen('xxx');
var_dump( error_get_last() );

... и получить следующее:

array(4) {
  ["type"]=>
  int(2)
  ["message"]=>
  string(46) "fopen() expects at least 2 parameters, 1 given"
  ["file"]=>
  string(69) "C:\Documents and Settings\ALVARO.GONZALEZ\Mis documentos\tmp\test.php"
  ["line"]=>
  int(3)
}

Это не работает, если вы замените встроенный обработчик ошибок:

function custom_error_handler($errno, $errstr, $errfile, $errline){
    $ignore = ($errno & error_reporting()) == 0;
    if(!$ignore){
        echo "[Error happened: $errstr]\n";
    }
    return TRUE;
}
set_error_handler('custom_error_handler');

@fopen('xxx');
var_dump( error_get_last() ); // NULL

Если вы сохраните оба обработчика ошибок ...

function custom_error_handler($errno, $errstr, $errfile, $errline){
    $ignore = ($errno & error_reporting()) == 0;
    if(!$ignore){
        echo "[Error happened: $errstr]\n";
    }
    return FALSE;
}
set_error_handler('custom_error_handler');

error_reporting(E_ALL);
echo $foo;

... вы получаете побочные эффекты:

[Error happened: Undefined variable: foo]

Notice: Undefined variable: foo in C:\Documents and Settings\ALVARO.GONZALEZ\Mis documentos\tmp\test.php on line 15

Call Stack:
    0.0004     329720   1. {main}() C:\Documents and Settings\ALVARO.GONZALEZ\Mis documentos\tmp\test.php:0

... вместо просто:

[Error happened: Undefined variable: foo]

Я хочу, чтобы мой собственный обработчик ошибок правильно взаимодействовал с error_get_last . Я хочу, чтобы error_get_last работал нормально.

7
задан Pacerier 28 August 2015 в 09:42
поделиться