Стандартные функции PHP ошибка с файл строка и т. д?


Итак, вместо множества экземпляров

if (odbc_exec($sql))
{
}
else
{
  myErrorHandlingFunction();
}

Я обертываю это в функцию

function myOdbxExec($sql)
{
  if (odbc_exec($sql))
  {
  }
  else
  {
    myErrorHandlingFunction();
  }
}

Но я хотел бы myErrorHandlingFunction() сообщить о таких вещах, как __LINE__ __FILE__ etc

, который выглядит так, как будто я должен передать thoses infos каждому вызову вспомогательных функций, например myOdbxExec($sql, __FILE__, __LINE__), что делает мой код грязным.

function myErrorHandlingFunction($errorTExt, $fiel, $line)
{
  // error reporting code goes here
}


function myOdbxExec($sql, $file, $line)
{
  if (odbc_exec($sql))
  {
  }
  else
  {
    myErrorHandlingFunction();
  }
}

$sql = 'select * from ... blah, blah, blah...';
myOdbxExec($sql, __FILE__, __LINE__);   // <==== this is *ugly*

В C я бы спрятал все это за #define, например #define MY_OFBC_EXEC(sql) myOdbxExec(sql, __FILE__, __LINE__)

1) (Как) я могу сделать это в PHP 2) что еще стоит выбросить из головы? например, error_get_last()? но это ... не имеет смысла, если odbc_exec() не работает ...

Перефразируя вопрос-каков общий подход к обработке ошибок PHP? (особенно, когда set_error_handler() на самом деле не применяется?


Edit: просто для ясности - я действительно хочу обрабатывать исключения, ошибки программирования и т. д., Но, как показывает мой пример, я также хочу обрабатывать soemthings, которые интерпретатор TEH PHP может не считать ошибкой, например odbc_exec(), возвращающей false().

3 4

3 ответа:

Оба вышеприведенных ответа, упоминающие debug_backtrace, отвечают на вашу _ _ _ _ _ _ строку_____ / _______файл _ _ _ вопрос с функцией debug_backtrace (). Я тоже хотел получить этот ответ в прошлом, поэтому собрал быструю функцию для его обработки.

function myErrorHandlingFunction($message, $type=E_USER_NOTICE) {
    $backtrace = debug_backtrace();
    foreach($backtrace as $entry) {
        if ($entry['function'] == __FUNCTION__) {
            trigger_error($entry['file'] . '#' . $entry['line'] . ' ' . $message, $type);
            return true;
        }
    }
    return false;
}

Затем можно вызвать, например, myErrorHandlingFunction('my error message');

Или myErrorHandlingFunction('my fatal error message', E_USER_ERROR);

Или try { ... } catch (Exception $e) { myErrorHandlingFunction($e->getMessage()); }

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

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

EDIT в ответ на комментарий OP:

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

<?PHP
if (! odbc_exec($sql) ) 
    throw new DatabaseException('odbc_exec returned false, that bastard!');

Использование debug_backtrace чтобы выяснить, откуда была вызвана функция в обработчике ошибок. Вызываете ли вы этот обработчик ошибок, вызывая его вручную, вызывая и перехватывая исключения, PHPs error_handler или любой другой метод, зависит от дизайна приложения и на самом деле не так уж сильно отличается от других языков.