From 950ad650d963517ed8d4be0da9122185bee4803d Mon Sep 17 00:00:00 2001 From: Alexander Zhirov Date: Tue, 28 Feb 2023 15:17:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B2=D0=B0=209=20=D0=B3?= =?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=B2=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 09-обработка-ошибок/README.md | 495 +++++++++++++++++++++++ 09-обработка-ошибок/images/image-9-2.png | Bin 0 -> 33345 bytes 2 files changed, 495 insertions(+) create mode 100644 09-обработка-ошибок/images/image-9-2.png diff --git a/09-обработка-ошибок/README.md b/09-обработка-ошибок/README.md index e69de29..dd4f08f 100644 --- a/09-обработка-ошибок/README.md +++ b/09-обработка-ошибок/README.md @@ -0,0 +1,495 @@ +# 9. Обработка ошибок + +- [9.1. Порождение и обработка исключительных ситуаций](#9-1-порождение-и-обработка-исключительных-ситуаций) +- [9.2. Типы](#9-2-типы) +- [9.3. Блоки finally](#9-3-блоки-finally) +- [9.4. Функции, не порождающие исключения (nothrow), и особая природа класса Throwable](#9-4-функции-не-порождающие-исключения-nothrow-и-особая-природа-класса-throwable) +- [9.5. Вторичные исключения](#9-5-вторичные-исключения) +- [9.6. Раскрутка стека и код, защищенный от исключений](#9-6-раскрутка-стека-и-код-защищенный-от-исключений) +- [9.7. Неперехваченные исключения](#9-7-неперехваченные-исключения) + +Обработка ошибок – это слабо формализованная область программного инжиниринга, связанная с обработкой ожидаемых и возникших ошибочных ситуаций, способных помешать нормальному функционированию системы. Обработка исключительных ситуаций (исключений) – подход к обработке ошибок, принятый во многих современных языках (включая D) и уже успевший породить великое множество руководств, методик и, конечно, споров. + +Исключения – это средство языка, реализующее обработку ошибок благодаря специальным обходным путям передачи управления. Если функции не удается вернуть вызвавшему ее коду осмысленный результат, она может породить объект исключения, в котором закодирована причина ошибки. Порождение исключений (throwing) – это карточка «Бесплатно освободитесь из тюрьмы»[^1], освобождающая функцию от ее обычных обязанностей. Исключение пропускает всех инициаторов вызовов, не предусматривающих его обработку, и попадает в *место обработки*, где и принимаются чрезвычайные меры. В хорошо спроектированной программе гораздо меньше мест обработки, чем мест порождения исключений, что способствует централизованной обработке ошибок с многократным использованием кода. Все это было бы проблематично организовать на основе традиционных методик с вездесущими кодами ошибки. + +[В начало ⮍](#9-обработка-ошибок) + +## 9.1. Порождение и обработка исключительных ситуаций + +D использует популярную модель исключений. Функция может инициировать исключения с помощью инструкции `throw` (см. раздел 3.11), порождающей объект особого типа. Чтобы завладеть этим объектом, код должен использовать инструкцию `try` (см. раздел 3.11), где этот объект указан в блоке `catch`. Перефразируя пословицу, лучше один пример кода, чем 1024 слова. Так что рассмотрим пример: + +```d +import std.stdio; + +void main() +{ + try + { + auto x = fun(); + } + catch (Exception e) + { + writeln(e); + } +} + +int fun() +{ + return gun() * 2; +} + +int gun() +{ + throw new Exception("Вернемся прямо в main"); +} +``` + +Вместо того чтобы вернуть значение типа `int`, функция `gun` решает породить исключение, в данном случае это экземпляр класса `Exception`. В порожденном объекте можно передать любую информацию о том, что произошло. Управление передается исключительным путем (что освобождает от возвращения результата не только функцию, породившую исключение, но и всех инициаторов ее вызова) тому из инициаторов вызова, который готов обработать ошибку с помощью блока `catch`. + +После выполнения инструкции `throw` функция `fun` полностью пропускается, поскольку она не готова обработать исключение. Вот в чем принципиальная разница между обработкой ошибок старой школы, когда ошибки вручную проводились через все уровни вызовов, и относительно новым подходом – обработкой исключений, когда управление искусно передается из места возникновения ошибки (`gun`) непосредственно туда, где есть все необходимое для ее обработки (блок `catch` в функции `main`). Такой подход обещает более простую, централизованную обработку ошибок, освобождая множество функций от обязанности проталкивать ошибки дальше по стеку; `fun` может оставаться в блаженном неведении о прямом сообщении между `gun` и `main`. + +К сожалению, непосредственная передача потока управления из места порождения в место обработки – это также и слабое звено обработки исключений: на самом деле, то блаженное неведение – лишь несбыточная мечта. В действительности, функции, пересекаемые исключением, должны помнить о дополнительных неявных точках выхода и гарантировать поддержку инвариантов программы независимо от того, каким путем будет передано управление. D предоставляет надежные механизмы, обеспечивающие сохранение инвариантности при возникновении исключений. В свое время мы обсудим их в этой главе. + +[В начало ⮍](#9-1-порождение-и-обработка-исключительных-ситуаций) [Наверх ⮍](#9-обработка-ошибок) + +## 9.2. Типы + +Базовая иерархия исключений в D проста (рис. 9.1). Инструкция `throw` порождает не просто какие-то значения, а только объекты-потомки класса `Throwable`. В подавляющем большинстве случаев код действительно порождает исключение как экземпляр потомка класса `Exception`, подкласса `Throwable`. Это обычные исключения, после которых возможно восстановление, и они распознаются языком именно так. Исключения-наследники `Throwable`, но не `Exception` (такие как `AssertError`; см. главу 10) относятся к фатальным ошибкам, после которых восстановление невозможно, и должны использоваться в коде крайне редко, практически никогда. (О том, что язык гарантирует в случае фатальных ошибок, а что нет, см. подробнее в разделе 9.4.) + +![image-9-2](images/image-9-2.png) + +***Рис. 9.1.*** *Обычные исключения – потомки класса `Exception`, поэтому их можно обработать с помощью блока `catch(Exception)`. Класс `Error` – прямой наследник класса `Throwable`. Обычный код должен перехватывать только исключения типа `Exception` и потомков `Exception`. Остальные исключения лишь позволяют аккуратно завершить работу программы в случае нахождения ошибки в ее логике* + +Инструкция `try` может определять больше одного блока `catch`, например: + +```d +try +{ + ... +} +catch (SomeException e) +{ + ... +} +catch (SomeOtherException e) +{ + ... +} +``` + +Исключения распространяются от места порождения до самого раннего места обработки, следуя правилу *первого совпадения*: сразу же после обнаружения блока `catch`, обрабатывающего исключение порожденного класса или его предка, этот блок `catch` активируется и порожденное исключение передается в него. Вот пример, порождающий и обрабатывающий исключения двух различных типов: + +```d +import std.stdio; + +class MyException : Exception +{ + this(string s) { super(s); } +} + +void fun(int x) +{ + if (x == 1) + { + throw new MyException(""); + } + else + { + throw new StdioException(""); + } +} + +void main() +{ + foreach (i; 1 .. 3) + { + try + { + fun(i); + } + catch (StdioException e) + { + writeln("StdioException"); + } + catch (Exception e) + { + writeln("Exception"); + } + } +} +``` + +Эта программа выводит на экран: + +``` +Exception +StdioException +``` + +Первый вызов `fun` порождает объект исключения типа `MyException`. При его сопоставлении с первым `catch`-обработчиком совпадения нет, но зато оно обнаруживается при сопоставлении со вторым блоком `catch`, поскольку `MyException` является потомком `Exception`. А в случае исключения, порожденного второй инструкцией `throw`, совпадение обнаруживается при сопоставлении с первым же `catch`-обработчиком. До первого совпадения этот процесс может затронуть и несколько уровней функций, как показывает следующий более замысловатый пример: + +```d +import std.stdio; + +class MyException : Exception +{ + this(string s) { super(s); } +} + +void fun(int x) +{ + if (x == 1) + { + throw new MyException(""); + } + else if (x == 2) + { + throw new StdioException(""); + } + else + { + throw new Exception(""); + } +} + +void funDriver(int x) +{ + try + { + fun(x); + } + catch (MyException e) + { + writeln("MyException"); + } +} + +unittest +{ + foreach (i; 1 .. 4) + { + try + { + funDriver(i); + } + catch (StdioException e) + { + writeln("StdioException"); + } + catch (Exception e) + { + writeln("Просто Exception"); + } + } +} +``` + +Эта программа выводит на экран: + +``` +MyException +StdioException +Просто Exception +``` + +поскольку обработчики в соответствии с концепцией пробуются по мере того, как поток управления всплывает вверх по стеку вызовов. + +У правила первого совпадения есть очевидный недостаток. Если блок `catch` для исключения типа `E1` расположен до блока `catch` для исключения типа `E2` и при этом `E2` является подтипом `E1`, то обработчик для `E2` оказывается недоступным. В такой ситуации компилятор диагностирует ошибку. Например: + +```d +import std.stdio; + +void fun() +{ + try + { + ... + } + catch (Exception e) + { + ... + } + catch (StdioException e) + { + ... // Ошибка! + // Недоступный обработчик catch! + } +} +``` + +Ошибочность подобного кода очевидна, но всегда есть угроза динамического маскирования между разными функциями. Любая функция легко может сделать недееспособными `catch`-обработчики вызвавшей ее функции. Тем не менее в большинстве случаев это не ошибка, а лишь нормальное следствие динамики стека вызовов. + +[В начало ⮍](#9-2-типы) [Наверх ⮍](#9-обработка-ошибок) + +## 9.3. Блоки finally + +Инструкция `try` может завершаться блоком `finally`, что фактически означает: «Непременно выполните этот код, даже если наступит конец света или начнется потоп». Было или нет порождено исключение, блок `finally` будет выполнен просто как часть инструкции `try`, и вам решать, закончится ли это сбоем программы, порождением исключения, возвратом с помощью инструкции `return` или досрочным выходом из включающего цикла с помощью инструкции `break`. Например: + +```d +import std.stdio; + +string fun(int x) +{ + string result; + try + { + if (x == 1) + { + throw new Exception("некоторое исключение"); + } + result = "исключение не было порождено"; + return result; + } + catch (Exception e) + { + if (x == 2) throw e; + result = "исключение было порождено и обработано: " ~ e.toString; + return result; + } + finally + { + writeln("Выход из fun"); + } +} +``` + +При нормальном ходе выполнения функция `fun` вернет некоторое значение, при исключительном – породит исключение, но в любом случае она всегда напечатает в стандартный поток вывода: `Выход из fun`. + +[В начало ⮍](#9-3-блоки-finally) [Наверх ⮍](#9-обработка-ошибок) + +## 9.4. Функции, не порождающие исключения (nothrow), и особая природа класса Throwable + +С помощью ключевого слова `nothrow` можно объявить функцию, не порождающую исключения: + +```d +nothrow int iDontThrow(int a, int b) +{ + return a / b; +} +``` + +Функции, не порождающие исключения, уже упоминались в разделе 5.11.2. А вот и новый поворот сюжета: атрибут `nothrow` обещает, что функция не породит объект типа `Exception`. Но у функции по-прежнему остается право порождать объекты более грозного класса `Throwable`. Собственно, восстановление после исключений типа `Throwable` считается невозможным, поэтому компилятору разрешается не «продумывать» ход событий при возникновении такого исключения, соответственно он оптимизирует код исходя из предположения, что никакого исключения нет. Для функций с атрибутом `nothrow` компилятор упрощает последовательности входа и выхода, не планируя экстренные мероприятия на случай, если будет порождено исключение. + +Проясним и подчеркнем особый статус класса `Throwable`. Первое правило для исключений `Throwable`: исключения `Throwable` не обрабатывают. Решив обработать такие исключения с помощью блока `catch`, вы не можете рассчитывать на то, что деструкторы структур будут вызваны, а блоки `finally` – выполнены. Это означает, что состояние вашей системы неопределенно и может быть нарушен целый ряд высокоуровневых инвариантов, на которые вы полагаетесь при нормальном исполнении. Тем не менее D гарантирует безопасность базовых типов и целостность стандартной библиотеки. Вы не можете рассчитывать на высокоуровневую целостность состояния своего приложения, поскольку не сработало неизвестное количество кода, обеспечивающего эту целостность. Так что при обработке `Throwable` вам доступны только несколько простых операций. Все, что вы сможете сделать в большинстве случаев, – это вывести сообщение об ошибке в стандартный поток или в файл журнала, попытаться сохранить в отдельном файле то, что еще можно сохранить, и, стиснув зубы, достойно завершить выполнение программы насколько это возможно. + +[В начало ⮍](#9-4-функции-не-порождающие-исключения-nothrow-и-особая-природа-класса-throwable) [Наверх ⮍](#9-обработка-ошибок) + +## 9.5. Вторичные исключения + +Иногда во время обработки исключения порождается еще одно. Например: + +```d +import std.conv; + +class MyException : Exception +{ + this(string s) { super(s); } +} + +void fun() +{ + try + { + throw new Exception("порождено в fun"); + } + finally + { + gun(100); + } +} + +void gun(int x) +{ + try + { + throw new MyException(text("порождено в gun #", x)); + } + finally + { + if (x > 1) + { + gun(x - 1); + } + } +} +``` + +Что происходит, когда вызвана функция `fun`? Ситуация на грани непредсказуемости. Во-первых, `fun` пытается породить исключение, но благодаря упомянутой привилегии блока `finally` всегда выполняться «даже если наступит конец света или начнется потоп», `gun(100)` вызывается тогда же, когда из `fun` вылетает `Exception`. В свою очередь, вызов `gun(100)` создает исключение типа `MyException` с сообщением `"порождено в gun #100"`. Назовем второе исключение *вторичным*, чтобы отличать его от порожденного первым, которое мы назовем *первичным*. Затем уже функция `gun` с помощью блока `finally` порождает добавочные вторичные исключения – ровно 100 исключений. Такой код испугал бы и самого Макиавелли. + +Ввиду необходимости обрабатывать вторичные исключения язык может выбрать один из следующих вариантов поведения: + +- немедленно прервать выполнение; +- продолжить распространять первичное исключение, игнорируя все вторичные; +- заменить первичное исключение вторичным и продолжить распространять его; +- продолжить в той или иной форме распространять и первичное, и все вторичные исключения. + +С точки зрения сохранения информации о происходящем последний подход видится наиболее обоснованным, но и самым сложным в реализации. Например, осмысленно обработать залп исключений гораздо труднее, чем одно исключение. + +D выбрал подход простой и эффективный. Всякий объект типа `Throwable` содержит ссылку на следующий вторичный объект типа `Throwable`. Этот вторичный объект доступен через свойство `Throwable.next`. Если вторичных исключений (больше) нет, значением свойства `Throwable.next` будет `null`. По сути, создается односвязный список с полной информацией обо всех вторичных ошибках в порядке их возникновения. В голове списка находится первичное исключение. Вот ключевые моменты определения `Throwable`: + +```d +class Throwable +{ + this(string s); + override string toString(); + @property Throwable next(); +} +``` + +Разделение исключений на первичное и вторичные позволяет реализовать очень простую модель поведения. В любой момент, когда бы ни порождалось исключение, первичное исключение или уже порождено, или нет. Если нет, то порождаемое исключение становится первичным. Иначе порождаемое исключение добавляется в конец односвязного списка, головой которого является первичное исключение. Продолжив начатый выше пример, напечатаем всю цепочку исключений: + +```d +unittest +{ + try + { + fun(); + } + catch (Exception e) + { + writeln("Первичное исключение: исключение типа ", typeid(e), " ", e); + Throwable secondary; + while ((secondary = secondary.next) !is null) + { + writeln("Вторичное исключение: исключение типа ", typeid(e), " ", e); + } + } +} +``` + +Этот код напечатает: + +``` +Первичное исключение: исключение типа Exception порожденов fun +Вторичное исключение: исключение типа MyException порожденов gun #100 +Вторичное исключение: исключение типа MyException порожденов gun #99 +... +Вторичное исключение: исключение типа MyException порожденов gun #1 +``` + +Вторичные исключения появляются в этой последовательности, поскольку присоединение к списку исключений выполняется в момент порождения исключения. Каждый раз инструкция `throw` извлекает первичное исключение (если есть), регистрирует новое исключение и инициирует или продолжает процесс порождения исключений. + +Благодаря вторичным исключениям код на D может порождать исключения внутри деструкторов и блоков инструкций `scope`. В месте обработки исключения доступна полная информация о том, что произошло. + +[В начало ⮍](#9-5-вторичные-исключения) [Наверх ⮍](#9-обработка-ошибок) + +## 9.6. Раскрутка стека и код, защищенный от исключений + +Пока исключение в полете, управление переносится из изначального места возникновения исключения через всю иерархию вверх до обработчика, при сопоставлении с которым происходит совпадение. Все участвующие в цепочке вызовов функции пропускаются. Ну, или почти все. Должную очистку после вызова пропускаемых функций обеспечивает так называемая *раскрутка стека* (*stack unwinding*) – часть процесса распространения исключения. Язык гарантирует, что пока исключение в полете, выполняются следующие фрагменты кода: + +- деструкторы расположенных в стеке объектов-структур всех пропущенных функций; +- блоки `finally` всех пропускаемых функций; +- инструкции `scope(exit)` и `scope(failure)`, действующие на момент порождения исключения. + +Раскрутка стека – бесценная помощь в обеспечении корректности программы при возникновении исключений. Программы, использующие исключения, обычно предрасположены к утечке ресурсов. Многие ресурсы рассчитаны только на использование в режиме «получить/освободить», а при порождении исключений то и дело возникают малозаметные потоки управления, «забывающие» освободить ресурсы. Такие ресурсы лучше всего инкапсулировать в структуры, которые надлежащим образом освобождают управляемые ресурсы в своих деструкторах. Эта тема уже обсуждалась в разделе 7.1.3.6, пример такой инкапсуляции – стандартный тип `File` из модуля `std.stdio`. Структура `File` управляет системным дескриптором файла и гарантирует, что при уничтожении объекта типа `File` внутренний дескриптор будет корректно закрыт. Объект типа `File` можно копировать; счетчик ссылок отслеживает все активные копии; копия, уничтожаемая последней, закрывает файл в его низкоуровневом представлении. Этот популярный идиоматический подход к использованию деструкторов высоко ценят программисты на C++. (Данная идиома известна как RAII, см. раздел 6.16.) Другие языки и фреймворки также используют подсчет ссылок, вручную или автоматически. + +Утечка ресурсов – лишь одно из проявлений более масштабной проблемы. Иногда шаблон «выполнить/отменить» связан с ресурсом, который невозможно «пощупать». Например, при записи текста HTML-файла многие теги (например, ``) полагается закрывать парным тегом (``). Нелинейный поток управления, включающий порождение исключений, может привести к генерации некорректно сформированных HTML-документов. Например: + +```d +void sendHTML(Connection conn) +{ + conn.send(""); + ... // Отправить полезную информацию в файл + conn.send(""); +} +``` + +Если код между двумя вызовами `conn.send` преждевременно прервет выполнение функции `sendHTML`, то закрывающий тег не будет отправлен и результатом станет некорректный поток HTML-данных. Такую же проблему могла бы вызвать инструкция `return`, расположенная в середине `sendHTML`, но `return` можно хотя бы увидеть невооруженным глазом, просто внимательно просмотрев тело функции. Исключение же, напротив, может быть порождено любой из функций, вызывающих `sendHTML` (напрямую или косвенно). Из-за этого оценка корректности `sendHTML` становится гораздо более сложным и трудоемким процессом. Более того, у рассматриваемого кода есть серьезные проблемы со связанностью, поскольку корректность `sendHTML` зависит от того, как поведет себя при порождении исключений потенциально огромное число других функций. + +Одно из возможных решений – имитировать RAII (даже если никакие ресурсы не задействованы): определить структуру, которая отсылает закрывающий тег в своем деструкторе. В лучшем случае это паллиатив. На самом деле, нужно гарантировать выполнение определенного кода, а не захламлять программу типами и объектами. + +Другое возможное решение – воспользоваться блоком `finally`: + +```d +void sendHTML(Connection conn) +{ + try + { + conn.send(""); + ... + } + finally + { + conn.send(""); + } +} +``` + +У этого подхода другой недостаток – масштабируемость, вернее ее отсутствие. Слабая масштабируемость `finally` становится очевидной, как только появляются несколько вложенных пар `try`/`finally`. Например, добавим в пример еще и отправку корректно закрытого тега ``. Для этого потребуются *два* вложенных блока `try`/`finally`: + +```d +void sendHTML(Connection conn) +{ + try + { + conn.send(""); + ... // Отправить заголовок + try + { + conn.send(""); + ... // Отправить содержимое + } + finally + { + conn.send(""); + } + } + finally + { + conn.send(""); + } +} +``` + +Тот же результат можно получить альтернативным способом – с единственным блоком `finally` и дополнительной переменной состояния, отслеживающей, насколько продвинулось выполнение функции: + +```d +void sendHTML(Connection conn) +{ + int step = 0; + try + { + conn.send(""); + ... // Отправить заголовок + step = 1; + conn.send(""); + ... // Отправить содержимое + step = 2; + } + finally + { + if (step > 1) conn.send(""); + if (step > 0) conn.send(""); + } +} +``` + +При таком подходе дела обстоят куда лучше, но теперь целый кусок кода посвящен только управлению состоянием, что затуманивает истинное предназначение функции. + +Такие ситуации удобнее всего обрабатывать с помощью инструкций `scope`. Работающая функция в какой-то момент исполнения может включать инструкцию `scope`. Таким образом, любые фрагменты кода, представляющие собой логические пары, окажутся еще и объединенными физически. + +```d +void sendHTML(Connection conn) +{ + conn.send(""); + scope(exit) conn.send(""); + ... // Отправить заголовок + conn.send(""); + scope(exit) conn.send(""); + ... // Отправить содержимое +} +``` + +Новая организация кода обладает целым рядом привлекательных качеств. Во-первых, код теперь расположен линейно, без излишних вложенностей. Это позволяет легко разместить в коде сразу несколько пар типа «открыть/закрыть». Во-вторых, этот подход устраняет необходимость пристального рассмотрения кода функции `sendHTML` и вызываемых ею функций на предмет скрытых потоков управления, возникающих при возможном порождении исключений. В-третьих, взаимосвязанные понятия сгруппированы, что упрощает чтение и сопровождение кода. В-четвертых, код получается компактным, поскольку накладные расходы на запись инструкции `scope` малы. + +[В начало ⮍](#9-6-раскрутка-стека-и-код-защищенный-от-исключений) [Наверх ⮍](#9-обработка-ошибок) + +## 9.7. Неперехваченные исключения + +Если найти обработчик для исключения не удалось, встроенный обработчик просто выводит сообщение об исключении в стандартный поток ошибок и завершает выполнение с ненулевым кодом выхода. Эта схема работает не только для исключений, распространяемых из `main`, но и для исключений, порождаемых блоками `static this`. + +Как уже говорилось, обычно исключения типа `Throwable` не обрабатывают. В очень редких случаях вы, возможно, все же захотите обработать `Throwable` и принять какие-то экстренные меры, даже если наступит конец света или начнется потоп. Но при этом не рассчитывайте на осмысленное состояние системы в целом; логика вашей программы, скорее всего, будет нарушена, так что вы уже мало что сможете сделать. + +[В начало ⮍](#9-7-неперехваченные-исключения) [Наверх ⮍](#9-обработка-ошибок) + +[^1]: Имеется в виду карточка из игры «Монополия». – *Прим. пер.* diff --git a/09-обработка-ошибок/images/image-9-2.png b/09-обработка-ошибок/images/image-9-2.png new file mode 100644 index 0000000000000000000000000000000000000000..c6eb44c57677b58d678724dcfea083e83b73296c GIT binary patch literal 33345 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