Исключения и обработка исключений
Функции обработки исключений в языке C# помогают вам справиться с непредвиденными или исключительными проблемами, которые возникают при выполнении программы. При обработке исключений используются ключевые слова try
, catch
и finally
для действий, которые могут оказаться неудачными. Это позволяет обрабатывать ошибки так, как кажется разумным, а также правильно высвобождать ресурсы. Исключения могут создаваться средой выполнения (CLR), платформой .NET , библиотеками сторонних поставщиков или кодом самого приложения. Чтобы создать исключение, используйте ключевое слово throw
.
Во многих случаях исключение может создаваться не тем методом, который вызывается в вашем коде, а одним из последующих методов в стеке вызовов. Если создается такое исключение, среда CLR разворачивает стек, находит метод с блоком catch
для исключений соответствующего типа и выполняет первый такой обнаруженный блок catch
. Если подходящий блок catch
не будет обнаружен во всем стеке вызовов, среда CLR завершает процесс и выводит сообщение для пользователя.
В этом примере метод выполняет проверку деления на нуль и перехватывает ошибку. Если не использовать обработку исключений, такая программа завершит работу с ошибкой DivideByZeroException was unhandled (Исключение DivideByZero не обработано).
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("{0} divided by {1} = {2}", a, b, result);
}
catch (DivideByZeroException)
{
Console.WriteLine("Attempted divide by zero.");
}
}
}
Общие сведения об исключениях
Исключения имеют следующие свойства.
- Исключения представляют собой типы, производные в конечном счете от
System.Exception
. - Используйте блок
try
для выполнения таких инструкций, которые могут создавать исключения. - Когда внутри такого блока
try
возникает исключение, поток управления переходит к первому подходящему обработчику исключений в стеке вызовов. В C# ключевое словоcatch
обозначает обработчик исключений. - Если для созданного исключения не существует обработчиков, выполнение программы прекращается с сообщением об ошибке.
- Не перехватывайте исключение, если вы не намерены его обрабатывать с сохранением известного состояния приложения. Если вы перехватываете
System.Exception
, создайте его заново в конце блокаcatch
, используя ключевое словоthrow
. - Если блок
catch
определяет переменную исключения, ее можно использовать для получения дополнительных сведений о типе созданного исключения. - Программа может явным образом создавать исключения с помощью ключевого слова
throw
. - Объекты исключения содержат подробные сведения об ошибке, например состояние стека вызовов и текстовое описание ошибки.
- Код в блоке
finally
выполняется, даже если создано исключение. Используйте блокfinally
, чтобы высвободить ресурсы, например закрыть потоки и файлы, которые были открыты внутри блокаtry
. - Управляемые исключения реализованы в платформе .NET на основе структурированного механизма обработки исключений Win32. Дополнительные сведения см. в статьях Structured Exception Handling (C/C++) (Структурированная обработка исключений в C и C++) и A Crash Course on the Depths of Win32 Structured Exception Handling (Интенсивное погружение в структурированную обработку исключений на платформе Win32).
Спецификация языка C#
Дополнительные сведения см. в разделе Исключения в Спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.