Скачиваний:
1
Добавлен:
04.09.2023
Размер:
1.17 Mб
Скачать

24 Механизм исключений (Назначение исключений. Основные категории исключений. Ключевые слова try, catch и finally, throw.)

В ходе выполнения программы может возникнуть «аварийная» ситуация.

Исключения (Exceptions) — это тип ошибки, которая происходит при выполнении приложения. Ошибки обычно означают появление неожиданных проблем. Тогда как исключения, обработка которых организована в коде, являются ожидаемыми, они происходят в коде приложений по различным причинам.

Исключения позволяют передать управление из одной части кода в другую часть. 

Функции:

  1. Гибкая реакция на аварийные ситуации

  2. Выполнение некоторых завершающих действий

Базовым для всех типов исключений является тип Exception. Этот тип определяет ряд свойств, с помощью которых можно получить информацию об исключении.

Свойства класса Exception

e имя свойства

  1. Data (номер ошибки)

  2. HelpLink (ссылка на подсказку)

  3. InnerException (внутренние исключения – хранит информацию об исключении, которое послужило причиной текущего исключения)

  4. Message – текст сообщения, соответствующий типу исключения

  5. Source – имя сборки или объекта, где возникло исключение

  6. Stack Track – последовательность выводов - возвращает строковое представление стека вызовов, которые привели к возникновению исключения

  7. Target Site – возвращает метод, в котором и было вызвано исключение

Есть более специализированные типы исключений, которые предназначены для обработки каких-то определенных видов исключений:

  1. DivideByZeroException: представляет исключение, которое генерируется при делении на ноль

  2. ArgumentOutOfRangeException: генерируется, если значение аргумента находится вне диапазона допустимых значений

  3. ArgumentException: генерируется, если в метод для параметра передается некорректное значение

  4. IndexOutOfRangeException: генерируется, если индекс элемента массива или коллекции находится вне диапазона допустимых значений, при попытке обращения за пределы массива

  5. InvalidCastException: генерируется при попытке произвести недопустимые преобразования типов

  6. NullReferenceException: генерируется при попытке обращения к объекту, который равен null (то есть, по сути, неопределен)

  7. OverflowException: генерируется при переполнении

  8. ArrayTypeMismatchException: генерируется при несоответствии типов массива

  9. OutofMemoreException: генерируется, если закончилась динамическая память

  10. FileNotFoundException: генерируется при отсутствии файла.

Обработка исключений C# осуществляется следующими ключевыми словами: try, catch, finally и throw.

try

{

Действие, которое может вызвать исключение

}

Возможные ситуации – открытие файла, запись за пределами массива, исчерпание памяти.

catch (Exception e) (e – имя переменной, может быть любым)

{

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

}

Например: MessageBox.Show

try - применяют для инкапсуляции. В него помещают так называемый «ненадежный» код, который может выдать ошибку. Там могут содержаться вызовы методов, обращения к интерфейсам, операторы цикла. В случае, если некая строка из этого блока выдает исключение, то он обрабатывается в блоке catch

• Когда происходит исключение, запускается блок catch. Здесь исключение можно обработать. Варианты обработки зависят от задач разработчиков и типа ошибки. Например, записать ошибку в лог, завершить работу скрипта или прописать выдачу конкретного сообщения. В случае, если блок catch пустой, программа пропустит исключение.

• Задача блока finally — выполнить определенный код вне зависимости от того, сработало исключение или нет. Это может быть, к примеру, освобождение объекта из памяти. Иногда блок finally не обязателен и опускается. Так происходит, когда обработка исключения предусматривает, что программа дальше будет выполняться.

• В языке C# существует несколько стандартных типов исключений, но есть возможность создавать их самостоятельно. Для этого используют оператор throw.

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

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

Когда в блоке try произошла ошибка, то выполнение программы приостанавливается, а общеязыковая исполняющая среда (CLR) производит поиск блока catch. Если блок найден, то после его выполнения идет блок finally. В другом случае программа аварийно завершит работу.

Например, в случае деления на 0, возникает исключение  System.DivideByZeroException. Чтобы не возникало таких ошибок, в блоке catch прописываем инструкцию, как указано в примере кода. Алгоритм не будет делить на 0 и выводить результаты, а программа аварийно завершается.

Пример использования try и catch в C#:

using System;

class MyClient

{

public static void Main()

{

int x = 0;

int div = 0;

try

{

div = 100 / x;

Console.WriteLine("This linein not executed");

}

catch (DivideByZeroException)

{

Console.WriteLine("Exception occured");

}

Console.WriteLine($"Result is {div}");

}

}

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

Пример:

using System;

namespace ConsoleApplication1

{

class Program

{

static void Main()

{

int i = int.Parse(Console.ReadLine());

byte j;

try

{

if (i > 255)

// Генерируем исключение

throw new OverflowException();

else

j = (byte)i;

}

catch (OverflowException)

{

Console.WriteLine("Возникло переполнение");

}

Console.ReadLine();

}

}

}