Стандартные функции 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 ответа:
Оба вышеприведенных ответа, упоминающие 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
чтобы выяснить, откуда была вызвана функция в обработчике ошибок. Вызываете ли вы этот обработчик ошибок, вызывая его вручную, вызывая и перехватывая исключения, PHPserror_handler
или любой другой метод, зависит от дизайна приложения и на самом деле не так уж сильно отличается от других языков.