Я пишу некоторый код на PHP (впрочем вопрос относится к любому языку программирования, поддерживающего исключения). С точки зрения обработки ошибок есть предложение сделать следующим образом:
1) Любые ошибки и предупреждения PHP транслировать в исключения с помощью
set_error_handler
2) Кидать собственные исключения в случаях, когда это требуется в силу логики программы
3) Разделить все исключения на
фатальные,
логгируемые и
игнорируемые. К какой категории отнести исключение определяется по типу исключения.
4) В качестве централизованного обработчика исключений через
set_error_handler назначить некоторый метод, который будет решать к какой категории относится исключение и выполнять одно из следующих действий:
а) Для фатальных исключений еще раз кидать его.
б) Для логгируемых исключений вносить запись в журнал и продолжать работу.
в) Для игнорируемых исключений просто продолжать работу.
Логика определения типа исключения может быть изменена через конфигурацию программы, поэтому можно сделать все исключения фатальными или же сделать некоторые исключения игнорируемыми. Проблема возникает с продолжением работы. Для того, чтобы любая функция продолжала свою работу после выкидывания исключения нужно везде писать блоки try-catch. При этом теряется смысл назначения централизованного обработчика исключений. Единственный вариант, который я вижу это что-то такое:
function helloWorld(){
try{
//Что-нибудь, кидающее исключение
} catch (Exception $e) {
Handler::handle($e);
}
}
Самый главный недостаток этого подхода — усиление жесткости связей в программе. В такой форме класс обработчика придется закодировать во многих местах и при дальнейшем рефакторинге могут возникнуть проблемы. Есть ли у кого идеи как можно решить подобную задачу? А может быть дело в неправильном подходе к исключениям? Тогда как еще сделать подобную централизованную обработку всех ошибок программы?