Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Функции обработки исключений языка 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#.