Skip to content

Commit

Permalink
fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
adelf committed Feb 21, 2020
1 parent 76dbfb3 commit f9a3c5e
Showing 1 changed file with 8 additions and 8 deletions.
16 changes: 8 additions & 8 deletions manuscript/5-error-handling.md
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ if err != nil {
Есть только один вариант выполнения запроса, который приводит к успеху: приложение получило валидные данные, сущность пользователя загружена из базы данных, старый пароль совпал, поменяли пароль на новый и сохранили все в базе.
Любой шаг в сторону от этого единого пути должен вызывать исключение.
Юзер ввёл невалидные данные - исключение, этому пользователю нельзя выполнить это действие - исключение, упал сервер с базой данных - разумеется, тоже исключение.
Проблемой Единого Верного Пути является то, что где-то нужно будет отделить ошибки клиента от ошибок сервера, поскольку ответы мы должны сгенерировать разные (помните про 400-ые и 500-цену коды ответов?) да и логироваться такие ошибки должны по-разному.
Проблемой Единого Верного Пути является то, что где-то нужно будет отделить ошибки клиента от ошибок сервера, поскольку ответы мы должны сгенерировать разные (помните про 400-ые и 500-ые коды ответов?) да и логироваться такие ошибки должны по-разному.

Сложно сказать какой из путей предпочтительнее.
Когда приложение только-только обзавелось отдельным слоем Приложения, второй путь кажется более приятным.
Expand Down Expand Up @@ -273,7 +273,7 @@ Eloquent тоже имеет методы для работы в таком ст
Некоторые исключения сигнализируют о проблемах в коде и должны быть исправлены немедленно.
Некоторые исключения являются нормой: интернет не идеален, запросы в самые стабильные API один раз из миллиона могут заканчиваться неудачей.
Однако если частота таких ошибок резко возрастает, то разработчики должны среагировать тоже.
В таких случаях, когда контроллере за ошибками требует много внимания, лучше использовать специализированные сервисы, которые позволят группировать исключения и работать с ними намного удобнее.
В таких случаях, когда контроль за ошибками требует много внимания, лучше использовать специализированные сервисы, которые позволят группировать исключения и работать с ними намного удобнее.
Если интересно, можете просто погуглить "error monitoring services" и найдёте несколько таких сервисов.
Большие компании строят свои специализированные решения для записи и анализа логов со всех своих серверов (часто на основе популярного на момент написания книги стэка ELK: Elastic, LogStash, Kibana).
Некоторые компании не логируют ошибки клиента.
Expand Down Expand Up @@ -404,8 +404,8 @@ class Handler extends ExceptionHandler
Простой пример глобального обработчика.
Метод **report** может быть использован для дополнительного логирования.
Вся **catch** секция из контроллера переехала в метод **render**.
Здесь все ошибки логики будут отловлены и правильные сообщения пользователя будут сгенерированы.
Для ошибок консоли есть незадокументированный метод **renderForConsole**(**$output**, **Exception** **$e**), который тоже можно перекрыть в этот классе.
Здесь все ошибки логики будут отловлены и будут сгенерированы правильные сообщения для пользователя.
Для ошибок консоли есть незадокументированный метод **renderForConsole**(**$output**, **Exception** **$e**), который тоже можно перекрыть в этом классе.
Посмотрите на контроллер:

```php
Expand All @@ -429,7 +429,7 @@ final class UserController
Подумайте какие ошибки там могут возникнуть?

* **Illuminate\Database\Eloquent\ModelNotFoundException** если пользователя с таким **id** не существует
* **Illuminate\Database\QueryException** если запрос в базу данных не может быть выполнен.
* **Illuminate\Database\QueryException** если запрос в базу данных не может быть выполнен
* **App\Exceptions\BusinessException** если старый пароль неверен
* **\TypeError** если где-то глубоко внутри кода функция **foo**(**SomeClass** **$x**) получит параметр **$x** с другим типом
* **\Error** если **$var->method()** будет вызван, когда переменная **$var** == **null**
Expand Down Expand Up @@ -530,7 +530,7 @@ public class File
}
```
Что сигнатура метода **getCanonicalPath** говорит разработчику?
Там нет никаких параметров, возвращает строку, может выбросить исключение **IOException** а также любое непроверяемое исключение.
Там нет никаких параметров, возвращает строку, может выбросить исключение **IOException**, а также любое непроверяемое исключение.
Возвращаясь к двум типам ошибок:

1. Ошибки, которые понятны вызывающему коду и могут быть эффективно обработаны там
Expand All @@ -543,7 +543,7 @@ public class File

Хорошо, в Java это есть, в PHP - нет.
Почему я все ещё об этом говорю?
IDE, которое я использую, PhpStorm, имитирует поведения Java.
IDE, которое я использую, PhpStorm, имитирует поведение Java.

```php
class Foo
Expand Down Expand Up @@ -583,7 +583,7 @@ class Foo
1. **ModelNotFoundException**, когда пользователь с таким **id** не найден
2. **BusinessException**, эта ошибка содержит сообщение, предназначенное для пользователя и может быть обработано сразу.
Все остальные ошибки могут быть обработаны позже.
Итак. в идеальном мире:
Итак, в идеальном мире:

```php
class ModelNotFoundException extends \Exception
Expand Down

0 comments on commit f9a3c5e

Please sign in to comment.