Содержание
На данный момент мы знаем достаточно про классы, наследование в 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 — название вашего приложения; YYYYYY — полный путь к файлу Program.cs или другому, в котором произошло исключение; ZZZZZ — номер строки на которой возникло исключение.
Свойство TargetSite
TargetSite — возвращает метод, в котором и было вызвано исключение. Например:
catch (System.DivideByZeroException e)
{
Console.WriteLine($"{e.TargetSite}");
}
выведет в консоль строку:
Свойство 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#. Практически каждый тип исключений содержит какую-либо информацию об исключении в своих собственных свойствах и позволяет делать обработку исключений более информативной.