Наиболее употребительные исключения C#

Наиболее употребительные исключения C#, Исключения C#, C# Полное руководство Герберт Шилдт, Язык программирования C#, C# полное руководство

В пространстве имен System определено несколько стандартных, встроенных исключений. Все эти исключения являются производными от класса SystemException, поскольку они генерируются системой CLR при появлении ошибки во время выполнения. В табл. 13.1 перечислены некоторые наиболее употребительные стандартные исключения.
Таблица 13.1. Наиболее употребительные исключения, определенные в пространстве имен System

Исключение

Значение

ArrayTypeMismatchException

Тип сохраняемого значения несовместим с типом массива

DivideByZeroException

Попытка деления на нуль

IndexOutOfRangeException

Индекс оказался за границами массива

InvalidCastException

Неверно выполнено динамическое приведение типов

OutOfMemoryException

Обращение к оператору new оказалось неудачным из-за недо­статочного объема свободной памяти

OverflowException '

Произошло арифметическое переполнение

NullReferenceException

Попытка использовать пустую ссылку, т.е. ссылку, которая не указывает ни на один из объектов

StackOverflowException

Переполнение стека

Большинство исключений, приведенных в табл. 13.1, не требуют особых пояснений, кроме исключения NullReferenceException. Это исключение генерируется при попытке использовать пустую ссылку на несуществующий объект, например, при вызове метода по пустой ссылке. Пустой называется такая ссылка, которая не указывает ни на один из объектов. Для того чтобы создать такую ссылку, достаточно, например, присвоить явным образом пустое значение переменной ссылочного типа, используя ключевое слово null. Пустые ссылки могут также появляться и другими, мейее очевидными путями. Ниже приведен пример программы, демонстрирующий обработку исключения NullReferenceException.

// Продемонстрировать обработку исключения NullReferenceException.

using System;

class X {
   int х;
   public X(int а) {
   х = а;
   }

   public int Add(X о) {
      return x + o.x;
   }
}

// Продемонстрировать генерирование и обработку
// исключения NullReferenceException.
class NREDemo {
   static void Main() {
      X p = new X(10) ;
      X q = null; // присвоить явным образом пустое значение переменной q
      int val;

      try {
         val = p.Add(q); // эта операция приведет к
                                // исключительной ситуации
      } catch (NullReferenceException) {
         Console.WriteLine( "Исключение NullReferenceException!");
         Console.WriteLine("ошибки...\n");

         //А теперь исправить ошибку.
         q = new X(9);
     val = p. Add (q);
      }
      Console.WriteLine("Значение val равно {0}", val);
   }
}

Вот к какому результату приводит выполнение этой программы:
   Исключение NullReferenceException!
   Исправление ошибки...

   Значение val равно 19

В приведенном выше примере программы создается класс X, в котором определяются член х и метод Add (), складывающий значение члена х в вызывающем объекте со значением члена х в объекте, передаваемом этому методу в качестве параметра. Оба объекта класса X создаются в методе Main (). Первый из них (переменная р) инициализируется, а второй (переменная q) — нет. Вместо этого переменной q присваивается пустое значение. Затем вызывается метод р. Add () с переменной q в качестве аргумента. Но поскольку переменная q не ссылается ни на один из объектов, то при попытке получить значение члена q.x генерируется исключекие NullReferenceException.
Особый интерес представляет исключение StackOverf lowException, генерируемое при переполнении стека. Такое может, в частности, произойти при неконтролируемом выполнении рекурсивного метода. В этом случае стек рано или поздно переполняется, но исключение StackOverf lowException не перехватывается программой, и поэтому ее выполнение прерывается преждевременно.