Что я обычно делаю, когда пишу код,
function changeBookAuthor(int $id, string $newName){
if(!$newName){
throw new MyAppException('No author name was provided');
}
$book = Books::find($id);
if(!$book){
throw new MyAppException('The provided book id could not be found');
}
}
в документе Laravel мы видим:
https://laravel.com/docs/5.4/errors
public function report(Exception $exception)
{
if ($exception instanceof CustomException) {
//
}
return parent::report($exception);
}
Теперь, как правильно обработать исключение? все они одно и то же исключение, и у них нет ни кода. Должен ли я предоставить код ошибки?
проблема с исключением php заключается в том, что они используют целые числа. Это довольно раздражает имхо. Лучше было бы 'changeauthor_bookid_notfound'
как код, а не случайное число. Должен ли я создать класс исключения для каждого отдельного исключения? например не использовать повторно MyAppException
это кажется немного утомительным. У меня было бы триллион классов.
Теперь, если для особого исключения я хочу особой обработки, с моим кодом, я не могу легко сделать это. У меня нет кода для проверки (например, $exception->code == 3331 then do special
) и у меня нет пользовательских классов исключений, ни
Каков хороший и надежный способ справиться с этим делом?
код, новый класс на каждую ошибку, что-то еще все вместе?
и если предоставить код, каков хороший способ сделать это?
«Правильный» способ сделать это — определить либо собственный класс Exception для каждого исключения, либо определить пользовательские исключения, основанные на типе генерируемой ошибки, однако следует понимать, что Laravel уже имеет много встроенных исключений и механизмов для обработки варианты использования вы обрисовали в общих чертах.
Например, в случае исключения «Книга не найдена» вместо того, чтобы вручную инициировать исключение, вы можете использовать Books::findOrFail($id);
который бросает экземпляр ModelNotFoundException
когда уместно.
Кроме того, в PHP нет необходимости обрабатывать исключения для необоснованных аргументов. Если это явно не указано как необязательный, требуются все аргументы метода, и Laravel выдает исключение PHP, если аргумент отсутствует.
Кроме того, Laravel предоставляет abort()
магический метод, который выдает ошибку HTTP вместе с пользовательским сообщением об ошибке и может использоваться следующим образом:
abort(418, "I'm a teapot...")
Таким образом, если вам необходимо заново изобрести колесо, правильный способ — определить пользовательские классы исключений и определить пользовательские обработчики для этих классов, но при этом следует понимать, что в Laravel уже есть много встроенных инструментов для управления исключениями без необходимости делать это.
Других решений пока нет …