Обработка исключительных ситуаций

Содержание

Слайд 2

Конструкция try..catch..finally Иногда при выполнении программы возникают ошибки, которые трудно предусмотреть

Конструкция try..catch..finally

Иногда при выполнении программы возникают ошибки, которые трудно предусмотреть или

предвидеть, а иногда и вовсе невозможно.
Например, при передачи файла по сети может неожиданно оборваться сетевое подключение. Такие ситуации называются исключениями. Язык C# предоставляет разработчикам возможности для обработки таких ситуаций. Для этого в C# предназначена конструкция try...catch...finally.
Слайд 3

Конструкция try...catch...finally.

 Конструкция try...catch...finally.

Слайд 4

При использовании блока try...catch..finally вначале выполняются все инструкции в блоке try.

При использовании блока try...catch..finally вначале выполняются все инструкции в блоке try. Если в этом

блоке не возникло исключений, то после его выполнения начинает выполняться блок finally. И затем конструкция try..catch..finally завершает свою работу.
Слайд 5

Если же в блоке try вдруг возникает исключение, то обычный порядок

Если же в блоке try вдруг возникает исключение, то обычный порядок

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

Рассмотрим следующий пример:

Рассмотрим следующий пример:

Слайд 7

В данном случае происходит деление числа на 0, что приведет к

В данном случае происходит деление числа на 0, что приведет к

генерации исключения. И при запуске приложения в режиме отладки мы увидим в Visual Studio окошко, которое информирует об исключении:
Слайд 8

В этом окошке мы видим, что возникло исключение, которое представляет тип

В этом окошке мы видим, что возникло исключение, которое представляет тип System.DivideByZeroException,

то есть попытка деления на ноль. С помощью пункта View Details можно посомтреть более детальную информацию об исключении.
И в этом случае единственное, что нам остается, это завершить выполнение программы.
Слайд 9

Чтобы избежать подобного аварийного завершения программы, следует использовать для обработки исключений

Чтобы избежать подобного аварийного завершения программы, следует использовать для обработки исключений

конструкцию try...catch...finally. Так, перепишем пример следующим образом:
Слайд 10

В данном случае у нас опять же возникнет исключение в блоке

В данном случае у нас опять же возникнет исключение в блоке

try, так как мы пытаемся разделить на ноль. И дойдя до строки
int y = x / 0;
выполнение программы остановится. CLR найдет блок catch и передаст управление этому блоку.
После блока catch будет выполняться блок finally.
Таким образом, программа по-прежнему не будет выполнять деление на ноль и соответственно не будет выводить результат этого деления, но теперь она не будет аварийно завершаться, а исключение будет обрабатываться в блоке catch.
Слайд 11

Следует отметить, что в этой конструкции обязателен блок try. При наличии

Следует отметить, что в этой конструкции обязателен блок try. При наличии

блока catch мы можем опустить блок finally:
Слайд 12

И, наоборот, при наличии блока finally мы можем опустить блок catch

И, наоборот, при наличии блока finally мы можем опустить блок catch

и не обрабатывать исключение:
Однако, хотя с точки зрения синтаксиса C# такая конструкция вполне корректна, тем не менее, поскольку CLR не сможет найти нужный блок catch, то исключение не будет обработано, и программа аварийно завершится.
Слайд 13

Обработка исключений и условные конструкции Ряд исключительных ситуаций может быть предвиден

Обработка исключений и условные конструкции

Ряд исключительных ситуаций может быть предвиден разработчиком.

Например, пусть программа предусматривает ввод числа и вывод его квадрата:
Слайд 14

Если пользователь введет не число, а строку, какие-то другие символы, то

Если пользователь введет не число, а строку, какие-то другие символы, то

программа выпадет в ошибку. С одной стороны, здесь как раз та ситуация, когда можно применить блок try..catch, чтобы обработать возможную ошибку. Однако гораздо оптимальнее было бы проверить допустимость преобразования:
Слайд 15

Метод Int32.TryParse() возвращает true, если преобразование можно осуществить, и false -

Метод Int32.TryParse() возвращает true, если преобразование можно осуществить, и false -

если нельзя. При допустимости преобразования переменная x будет содержать введенное число. Так, не используя try...catch можно обработать возможную исключительную ситуацию.
С точки зрения производительности использование блоков try..catch более накладно, чем применение условных конструкций. Поэтому по возможности вместо try..catch лучше использовать условные конструкции на проверку исключительных ситуаций.