Я подумал, что брошу свои два цента в банк и расскажу, что я обычно использую, как есть, или с небольшими настройками для библиотек PHP, которые я создаю и которые часто используются другими разработчиками.
Я подразделяю ошибки, которые могут возникнуть при выполнении программы, на две категории: те, которые являются результатом ошибочного программирования, и те, которые возникают из-за ошибки пользователя или какого-либо внешнего фактора. В первом случае я использую trigger_error в сочетании с E_USER_ERROR, а во втором - Исключение, в частности, Исключение пакета, которое затем наследуется всеми другими Исключениями в библиотеке.
Примером ошибки при разработке может быть передача целого числа в параметре, который, как ожидается, будет строкой (до V7), или доступ к методу или свойству класса, который не существует. (Вы можете использовать здесь свое собственное воображение разработчика.) Очевидно, что другому разработчику не нужно заботиться о том, что ошибка была сгенерирована глубоко в недрах оператора __get или __set или какой-то другой магической конструкции, а скорее они захотят узнать в частности, где их ошибка. Посмотрим правде в глаза ... разработчики не любят пробираться через след.
Таким образом, метод, с помощью которого я локализую сообщение об ошибке, просто:
function localize_error_msg($msg, $level) {
$level = (int)$level;
$backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, $level + 1)[$level];
return $msg . " in " . $backtrace['file'] . " on line " . $backtrace['line'];
}
Я передаю уровень обратной трассировки, который зависит от используемой конструкции, которая обычно равна 1 или 2, а остальное не требует пояснений.
Чтобы предотвратить повторяющуюся последовательность «в файле в строке n», я добавляю этот обработчик ошибок:
set_error_handler(function($errno, $errstr, $errfile, $errline) {
if (preg_match('/on line \d+$/', $errstr) === 1)
die($errstr);
else return false;
}, E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE);
Опять же, мне нравится быть простым. Можно утверждать, что локализация сообщения об ошибке должна происходить в обработчике, но тогда вы должны иметь возможность проходить в глубину, которая теперь составляет еще 2 уровня глубоко внутри обработчика, и, ну, после что.
Счастливые тропы!