Содержание
На данный момент мы знаем достаточно про классы, наследование в 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#. Практически каждый тип исключений содержит какую-либо информацию об исключении в своих собственных свойствах и позволяет делать обработку исключений более информативной.