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

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

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

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();

}

}

}

25 Наследование в C#. Понятие наследования в C#. Механизм наследования. Базовый и производный классы. Наследование и модификаторы доступа.

Наследование – это один из принципов объектно-ориентированного программирования, который дает возможность классу использовать программный код другого (базового) класса, дополняя его своими собственными деталями реализации. Иными словами, при наследовании происходит получение нового (производного) класса, который содержит программный код базового класса с указанием собственных особенностей использования. Наследование принадлежит к типу is-a отношений между классами.

Базовый класс (base class) – это класс, программный код которого используется в унаследованных (производных) классах. Производный класс

(derived class) – это класс, который использует программный код базового класса и изменяет (расширяет) его под свои потребности. В свою очередь,

класс derived может быть базовым для другого класса нижнего уровня.

// базовый класс class Base

{

//поля, методы класса

//...

}

// класс, унаследованный от класса Base class Derived : Base

{

//поля, методы класса

//...

}

Язык программирования C# не поддерживает множественного наследования (в отличие от языка C++). Из конкретного класса одновременно может быть унаследована только один класс.

Если элемент класса (поле, метод, свойство и т.п.) реализован с модификатором доступа protected, то к нему выполняются следующие правила:

элемент доступен в пределах класса, в котором он объявлен, а также в унаследованных классах;

элемент недоступен из экземпляра класса.

Модификатор доступа protected internal объединяет ограничение

модификатора protected и модификатора internal (см. пример ниже). Здесь

возможны два случая:

Ситуация, когда класс с protected internal элементом и создаваемый экземпляр этого класса находятся в одной сборке. В этом случае доступ из экземпляра класса к protected internal элементу есть (расширение ключевого слова internal). Также есть доступ из производного класса (расширение ключевого слова protected).

Ситуация, когда класс с protected internal элементом объявлен в одной сборке, а экземпляр этого класса создается в другой сборке. В этом случае экземпляр не имеет доступа к protected internal элементу (ограничение

internal). Но можно создать производный класс и из этого класса получить

доступ к protected internal элементу (расширение protected).