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 действительно хорош для всего: начиная с ошибок уровня приложения, класса ошибок, системных ошибок - ничего.

Я действительно вкладываю довольно много работы в попытку управлять всеми типами ошибок, потому что каждая библиотека/функции обрабатывает ошибки по-разному.