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