День шестьдесят второй. #ЗаметкиНаПолях

Исключения. Начало

Конструируя тип, мы заранее пытаемся представить, в каких ситуациях он будет использоваться. Форма определения членов типа (типы данных свойств, параметры методов, возвращаемые значения и т.п.) становится интерфейсом типа. Члены типа определяют допустимые действия с типом и его экземплярами. Если член типа не может решить возложенную на него задачу, должно появляться исключение.

Пример обработки исключений:

try {

// код, требующий корректного восстановления или очистки ресурсов при возникновении исключения

}

catch (InvalidOperationException) {

// обработка исключения типа InvalidOperationException

}

catch (IOException ex) {

// обработка исключения типа IOException

// информация об исключении будет в переменной ex

}

catch {

// обработка остальных типов исключений

}

finally {

// код очистки ресурсов после операций блока try

// этот код исполняется ВСЕГДА

}

// код после блока finally выполняется, если не было сгенерировано исключений, либо если они были перехвачены блоками catch, а новых не генерировалось

Свойства исключений:

1. Исключения представляют собой типы, производные в конечном счете от System.Exception.

2. Блок try используется для выполнения таких инструкций, которые могут создавать исключения. Блок try должен быть связан хотя бы с одним блоком catch или finally.

3. Когда внутри такого блока try возникает исключение, поток управления переходит к первому подходящему обработчику исключений в стеке вызовов. В C# ключевое слово catch обозначает обработчик исключений. Если исключения не возникает, код в блоке catch не выполняется.

4. Если блок catch определяет переменную исключения, ее можно использовать для получения дополнительных сведений о типе созданного исключения.

5. Просмотр блоков catch осуществляется сверху вниз, поэтому исключения должны указываться в порядке от более специализированных к их базовым классам (если они есть) и наконец, к классу System.Exception. Иначе компилятор сообщит об ошибке, т.к. более узкоспециализированные блоки окажутся недостижимыми.

6. Если для созданного исключения не существует обработчиков, выполнение программы прекращается с сообщением об ошибке.

7. Программа может явным образом создавать исключения с помощью ключевого слова throw.

8. Объекты исключения содержат подробные сведения об ошибке, например состояние стека вызовов и текстовое описание ошибки.

9. Код в блоке finally выполняется даже в том случае, если создано исключение. Используйте блок finally, чтобы высвободить ресурсы, например закрыть потоки и файлы, которые были открыты внутри блока try. Блок finally помещается после всех блоков catch. Одному блоку try может соответствовать только один блок finally.



Источники:

- Джеффри Рихтер “CLR via C#”. 3-е изд. – СПб.: Питер, 2012. Глава 20.

-
https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/exceptions/