renovations
This commit is contained in:
parent
40681dc96d
commit
0febe4f5fd
13 changed files with 30 additions and 20 deletions
|
@ -334,7 +334,17 @@ try {
|
|||
|
||||
Цель функции `readData` в примере выше -- прочитать данные. При чтении могут возникать разные ошибки, не только `SyntaxError`, но и, возможно, к примеру, `URIError` (неправильное применение функций работы с URI), да и другие.
|
||||
|
||||
Код, который вызвал `readData`, хотел бы иметь информацию об ошибке, но проверять и перехватывать все типы ошибок ему недосуг. Тогда мы делаем одну ошибку, которая относится именно к общей операции, например `ReadError` и будем генерировать её. А "исходную" ошибку -- присваивать в свойство, на случай, если она, всё же, понадобится.
|
||||
Код, который вызвал `readData`, хотел бы иметь либо результат, либо информацию об ошибке.
|
||||
|
||||
При этом очень важным является вопрос: обязан ли этот внешний код знать о всевозможных типах ошибок, которые могут возникать при чтении данных, и уметь перехватывать их?
|
||||
|
||||
Обычно внешний код хотел бы работать "на уровень выше", и получать либо результат, либо "ошибку чтения данных", при этом какая именно ошибка произошла -- ему неважно. Ну, или, если будет важно, то хотелось бы иметь возможность это узнать, но обычно не требуется.
|
||||
|
||||
Это важнейший общий подход к проектированию -- каждый участок функционала должен получать информацию на том уровне, который ему необходим.
|
||||
|
||||
Мы его видим везде в грамотно построенном коде, но не всегда отдаём себе в этом отчёт.
|
||||
|
||||
В данном случае, если при чтении данных происходит ошибка, то мы будем генерировать её в виде объекта `ReadError`, с соответствующим сообщением. А "исходную" ошибку -- на всякий случай тоже сохраним, присвоим в свойство `cause` (англ. -- причина).
|
||||
|
||||
Выглядит это так:
|
||||
```js
|
||||
|
@ -380,6 +390,8 @@ try {
|
|||
}
|
||||
```
|
||||
|
||||
Этот подход называют "оборачиванием" исключения, поскольку мы берём ошибки "более низкого уровня" и "заворачиваем" их в `ReadError`, которая соответствует текущей задаче.
|
||||
|
||||
## Секция finally
|
||||
|
||||
Конструкция `try..catch` может содержать ещё один блок: `finally`.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue