Energy
education

сайт для тех, кто хочет изучать энергетику

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

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

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

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

Синтаксис

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

    
try
{
   // выражения вызывающие исключения
}
catch( ExceptionName e1 )
{
   // код обработки ошибок
}
catch( ExceptionName e2 )
{
   // код обработки ошибок
}
catch( ExceptionName eN )
{
   // код обработки ошибок
}
finally
{
   // выражение
}
    

Вы можете перечислить несколько выражений 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Обрабатывает ошибки, генерируемые при попытке разыменования указателя NULL на объект.
System.DivideByZeroExceptionОбрабатывает ошибки, генерируемые при делении на ноль.
System.InvalidCastExceptionОбрабатывает ошибки, генерируемые при недопустимом приведении или явном преобразовании типов.
System.OutOfMemoryExceptionОбрабатывает ошибки, генерируемые при недостаточной свободной памяти.
System.StackOverflowExceptionОбрабатывает ошибки, генерируемые при переполнении стека.

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

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

    
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("Исключение: {0}", e);
            }
            finally
            {
                Console.WriteLine("Результат: {0}", result);
            }
        }
        static void Main(string[] args)
        {
            DivNumbers d = new DivNumbers();
            d.division(25, 0);
            Console.ReadKey();
        }
    }
}
    

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

    
Исключение: System.DivideByZeroException: Attempted to divide by zero. 
at ...
Результат: 0
    

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

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

    
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: ApplicationException
{
   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