Unetway

C # - Обработка исключений

Исключением является проблема, возникающая во время выполнения программы. Исключение AC # - это ответ на исключительное обстоятельство, которое возникает во время работы программы, например попытка деления на ноль.

Исключения обеспечивают способ передачи контроля из одной части программы в другую. Обработка исключений C # построена на четырех ключевых словах: try , catch , finally и throw .

  • try - блок try идентифицирует блок кода, для которого активируются определенные исключения. За ним следует один или несколько блоков catch.
  • catch - программа выхватывает исключение с обработчиком исключений в месте в программе, где вы хотите справиться с этой проблемой. Ключевое слово catch указывает на улавливание исключения.
  • finally - блок finally используется для выполнения заданного набора операторов, независимо от того, выбрано или не выбрано исключение. Например, если вы открываете файл, он должен быть закрыт независимо от того, создано ли исключение или нет.
  • throw - программа выдает исключение, когда возникает проблема. Это делается с использованием ключевого слова throw.

Синтаксис

Предполагая, что блок вызывает исключение, метод выбирает исключение, используя комбинацию ключевых слов try и catch. Блок try / catch помещается вокруг кода, который может генерировать исключение. Код внутри блока try / catch называется защищенным кодом, а синтаксис использования try / catch выглядит следующим образом:

try {
   // statements causing exception
} catch( ExceptionName e1 ) {
   // error handling code
} catch( ExceptionName e2 ) {
   // error handling code
} catch( ExceptionName eN ) {
   // error handling code
} finally {
   // statements to be executed
}

Вы можете перечислить несколько операторов catch, чтобы поймать разные типы исключений, если ваш блок try вызывает более одного исключения в разных ситуациях.

Классы исключений в C #

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

Класс System.ApplicationException поддерживает исключения, создаваемые прикладными программами. Следовательно, исключения, определенные программистами, должны вытекать из этого класса.

Класс System.SystemException является базовым классом для всех предопределенных системных исключений.

В следующей таблице приведены некоторые предопределенные классы исключений, полученные из класса Sytem.SystemException:

System.IO.IOException

Обрабатывает ошибки ввода-вывода.

System.IndexOutOfRangeException

Обрабатывает ошибки, возникающие, когда метод ссылается на индекс массива вне диапазона.

System.ArrayTypeMismatchException

Обрабатывает ошибки, возникающие, когда тип несовместим с типом массива.

System.NullReferenceException

Обрабатывает ошибки, возникающие при ссылке на нулевой объект.

System.DivideByZeroException

Обрабатывает ошибки, возникающие при делении дивиденда на ноль.

System.InvalidCastException

Обрабатывает ошибки, возникающие при типизации.

System.OutOfMemoryException

Обрабатывает ошибки, возникающие из-за недостаточной свободной памяти.

System.StackOverflowException

Обрабатывает ошибки, возникающие при переполнении стека.

 

Обработка исключений

C # обеспечивает структурированное решение обработки исключений в виде блоков try и catch. Используя эти блоки, операторы основной программы отделены от операторов обработки ошибок.

Эти блоки обработки ошибок реализованы с использованием ключевых слов try , catch и finally . Ниже приведен пример исключения исключения при делении на нулевое условие:

using System;

namespace ErrorHandlingApplication {
   class DivNumbers {
      int result;
      
      DivNumbers() {
         result = 0;
      }
      public void division(int num1, int num2) {
         try {
            result = num1 / num2;
         } catch (DivideByZeroException e) {
            Console.WriteLine("Exception caught: {0}", e);
         } finally {
            Console.WriteLine("Result: {0}", result);
         }
      }
      static void Main(string[] args) {
         DivNumbers d = new DivNumbers();
         d.division(25, 0);
         Console.ReadKey();
      }
   }
}

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

Exception caught: System.DivideByZeroException: Attempted to divide by zero. 
at ...
Result: 0

Создание пользовательских исключений

Вы также можете определить свое собственное исключение. Пользовательские классы исключений выводятся из класса Exception. Следующий пример демонстрирует это:

using System;

namespace UserDefinedException {
   class TestTemperature {
      static void Main(string[] args) {
         Temperature temp = new Temperature();
         try {
            temp.showTemp();
         } catch(TempIsZeroException e) {
            Console.WriteLine("TempIsZeroException: {0}", e.Message);
         }
         Console.ReadKey();
      }
   }
}
public class TempIsZeroException: Exception {
   public TempIsZeroException(string message): base(message) {
   }
}
public class Temperature {
   int temperature = 0;
   
   public void showTemp() {
      
      if(temperature == 0) {
         throw (new TempIsZeroException("Zero Temperature found"));
      } else {
         Console.WriteLine("Temperature: {0}", temperature);
      }
   }
}

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

TempIsZeroException: Zero Temperature found

Метание объектов

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

Catch(Exception e) {
   ...
   Throw e
}