Поделиться через


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

Функции обработки исключений языка C# помогают справиться с непредвиденными или исключительными ситуациями, возникающими при выполнении программы. Обработка исключений использует try, catchи ключевые слова finally для проверки действий, которые могут не выполниться, для обработки сбоев при принятии решения о том, что это разумно сделать, и для очистки ресурсов после этого. Исключения могут создаваться средой CLR, библиотеками .NET или сторонними библиотеками или кодом приложения. Исключения создаются с помощью ключевого слова throw.

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

В этом примере метод проверяет деление по нулю и перехватывает ошибку. Без обработки исключений эта программа завершалась бы с ошибкой DivideByZeroException был необработан.

public class ExceptionTest
{
    static double SafeDivision(double x, double y)
    {
        if (y == 0)
            throw new DivideByZeroException();
        return x / y;
    }

    public static void Main()
    {
        // Input for test purposes. Change the values to see
        // exception handling behavior.
        double a = 98, b = 0;
        double result;

        try
        {
            result = SafeDivision(a, b);
            Console.WriteLine($"{a} divided by {b} = {result}");
        }
        catch (DivideByZeroException)
        {
            Console.WriteLine("Attempted divide by zero.");
        }
    }
}

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

Исключения имеют следующие свойства:

  • Исключения — это типы, производные от System.Exception.
  • Используйте блок try вокруг инструкций, которые могут вызывать исключения.
  • После возникновения исключения в блоке try поток управления переходит к первому связанному обработчику исключений, который присутствует в любом месте стека вызовов. В C#ключевое слово catch используется для определения обработчика исключений.
  • Если обработчик исключений для данного исключения отсутствует, программа перестает выполняться с сообщением об ошибке.
  • Не перехватывайте исключение, если не можете обработать его и оставить приложение в предсказуемом состоянии. Если вы поймаете System.Exception, повторно выбросьте его, используя ключевое слово throw в конце блока catch.
  • Если блок catch определяет переменную исключений, ее можно использовать для получения дополнительных сведений о типе исключения, которое произошло.
  • Исключения можно явно создать программой с помощью ключевого слова throw.
  • Объекты исключений содержат подробные сведения об ошибке, такие как состояние стека вызовов и текстовое описание ошибки.
  • Код в блоке finally выполняется независимо от того, возникает ли исключение. Используйте блок finally для освобождения ресурсов, например для закрытия всех потоков или файлов, открытых в блоке try.
  • Управляемые исключения в .NET реализованы поверх структурированного механизма обработки исключений Win32. Дополнительные сведения см. в структурированной обработке исключений (C/C++) и кратком курсе по углубленному изучению структурированной обработки исключений Win32.

Спецификация языка C#

Дополнительные сведения см. в исключениях в спецификации языка C#. Спецификация языка является авторитетным источником синтаксиса и использования C#.

См. также