PHP - преобразование всех ошибок в исключения - хорошее или плохое?
Мне было интересно, считал ли он плохую практику глобальным преобразованием всех ошибок PHP в исключения. Будет использовано следующее:
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
return false;
}
Предполагаю, что вы можете просто начать использовать "try/catch" вокруг определенных фрагментов кода, которые обычно генерируют ошибки.
Если это не случай Хорошего/Плохого, то какие из Gotchas могут возникнуть из этой практики?
Ответы
Ответ 1
К сожалению, это не будет работать на фатальном/парсе/etc. ошибки...
Не помню точно, но я пробовал это, и в некоторых случаях получил сообщение типа "невозможно исключить исключение без обходного пути...", но я не могу вспомнить условия для получения этого результата. Но теперь я использую этот путь и полностью удовлетворен.
Ответ 2
Используйте исключения для вещей, которые действительно не поддаются контролю.
Хорошо:
try {
if (fopen('file.txt', 'w') === false) {
throw new Exception('File could not be opened for write access.');
}
} catch (Exception $e) {
echo $e->getMessage();
}
Плохо:
try {
if (strlen($_POST['username']) < 5) {
throw new Exception('Username too short');
}
} catch (Exception $e) {
echo $e->getMessage();
}
Первый способ хорош, потому что это происходит, когда его что-то, что пользователь или приложение не может контролировать. Он не может открыть файл, потому что? может быть много причин.
Второй способ - использование try/catch при переполнении, когда вы должны использовать trigger_error. Второй способ сводится к тому, что пользователь не знает правила проверки имени пользователя.
Вкратце используйте исключения, когда вы не можете контролировать, что вы тестируете. Помните, что исключения имеют больше накладных расходов, а затем trigger_error, а также:)
Ответ 3
проработав много лет в Java/.Net в прошлом и в настоящее время php в последние годы, на самом деле раздражает наличие всех этих различных соглашений об ошибках, в то время как шаблон Exceptions действительно хорош для всего: начиная с ошибок уровня приложения, класса ошибок, системных ошибок - ничего.
Я действительно вкладываю довольно много работы в попытку управлять всеми типами ошибок, потому что каждая библиотека/функции обрабатывает ошибки по-разному.