Класс Exception и его свойства. Наиболее частые виды исключений в C#

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

Класс Exception — базовый класс всех типов исключений в C#

Как мы уже знаем, родителем всех классов в C# является класс System.Object. Так же, как Object является базовым для всех классов, так и Exception является базовым классом для всех абсолютно типов исключений в C#. Посмотрим, какие свойства есть у этого класса.

Свойство Message

Message — свойство, которое предоставляет сведения о причине возникновения исключения. Например:

catch (System.DivideByZeroException e)
{
    Console.WriteLine($"{e.Message}");
}

Выведет в консоль сообщение «Попытка деления на нуль.», если мы попытаемся поделить число на нуль, как было продемонстрировано в этой статье. Свойство Message является виртуальным (virtual), поэтому может быть переопределено в классах-наследниках.

Свойство Source

Source — свойство, которое возвращает или задает имя приложения или объекта, вызывавшего ошибку. Например:

catch (System.DivideByZeroException e)
{
    Console.WriteLine($"{e.Source}");
}

выведет в консоль название вашего приложения. Также, как и Message свойство виртуальное.

Свойство InnerException

InnerExceptionсвойство может использоваться для создания и сохранения последовательностей исключений во время обработки текущего исключения. По умолчанию содержит информацию об исключении, которое послужило причиной текущего исключения. Например:

catch (System.DivideByZeroException e) when (e.InnerException != null)
{
    Console.WriteLine($"{e.InnerException.Message}");
}

В случае, если текущее исключение содержит информацию об исключении более высокого уровня ( исключении, которое послужило причиной текущего), то на экран будет выведено сообщение от исключения верхнего уровня. Обратите внимание, что не всегда InnerException, содержит какой-либо объект, поэтому в блоке catch был применен фильтр. В отличие от предыдущих свойств, это свойство нельзя переопределить в наследниках.

Свойство StackTrace

StackTrace — виртуальное свойство, которое содержит трассировку стека, которую можно использовать для определения места возникновения ошибки. Например:

catch (System.DivideByZeroException e) 
{
    Console.WriteLine($"{e.StackTrace}");
}

В консоль выведет строку примерно такого содержания:

в XXXXX.Program.Main(String[] args) в YYYYYY\Program.cs:строка ZZZZZ

где XXXXX — название вашего приложения; YYYYYY — полный путь к файлу Program.cs или другому, в котором произошло исключение; ZZZZZ — номер строки на которой возникло исключение.

Свойство TargetSite

TargetSite — возвращает метод, в котором и было вызвано исключение. Например:

catch (System.DivideByZeroException e) 
{
    Console.WriteLine($"{e.TargetSite}");
}

выведет в консоль строку:

Void Main(System.String[])

Свойство TargetSite нельзя переопределять в наследниках.

Наиболее распространенные типы исключений

Так как Exception — базовый класс для всех исключений, то, например, вот такой код:

catch (Exception)
{
    Console.WriteLine("Ошибка");
}

Полностью эквивалентен вот такому

catch 
{
    Console.WriteLine("Ошибка");
}

со всеми вытекающими последствиями о которых было рассказано в этой части статьи. Вместе с этим, в C# имеется достаточно большое количество типов исключений, специализирующихся на конкретных видах. Например, тот же тип DivideByZeroException о котором мы довольно подробно говорили. Рассмотрим наиболее часто встречающиеся типы исключений и примеры их появления в приложениях.

IndexOutOfRangeException

Вызывается средой выполнения только при неправильной индексации массива, например, при индексирование массива вне допустимого диапазона. Следующий код демонстрирует возникновение такого типа исключения:

int[] arr = new int[3];
arr[7] = 51; //тут возникнет исключение

NullReferenceException

Вызывается средой выполнения только в том случае, если имеется ссылка на пустой объект, например:

object o = null;
o.ToString();

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

ArgumentNullException

Вызывается методами, которые не допускают пустой аргумент, например

String s = null;
"Calculate".IndexOf(s);

строке s присвоено значение null. Вызов метода строки IndexOf приведет к вызову исключения ArgumentNullException.

ArgumentOutOfRangeException

Вызывается методами, проверяющими попадание аргументов в заданный диапазон, например:

String s = "string";
s.Substring(s.Length+1);

Здесь мы пробуем извлечь из строки подстроку, начиная с индекса, который явно выходит за диапазон (за размер строки — Length) — неизбежно возникновение исключения ArgumentOutOfRangeException

Итого

Сегодня мы рассмотрели основные свойства класса Exception — базового класса всех типов исключений в C#, а также познакомились с некоторыми наиболее часто встречающимися типами исключений в C#. Практически каждый тип исключений содержит какую-либо информацию об исключении в своих собственных свойствах и позволяет делать обработку исключений более информативной.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии