Exceptions in c sharp

Использование исключений

В C# ошибки в программе в среде выполнения передаются через программу с помощью механизма, который называется исключениями. Исключения вызываются кодом, который встречает ошибку, и перехватываются кодом, который может ее исправить. Исключения могут вызываться средой выполнения .NET или кодом в программе. Вызванное исключение передается вверх по стеку вызовов, пока не будет найден соответствующий оператор catch . Не перехваченные исключения обрабатываются универсальным обработчиком исключений, предоставляемым системой, которая отображает диалоговое окно.

Исключения представляются классами, производными от Exception. Этот класс определяет тип исключения и содержит свойства с подробными сведениями об исключении. При вызове исключения создается экземпляр производного класса, а также могут настраиваться свойства исключения. После этого с помощью ключевого слова throw вызывается объект. Пример:

class CustomException : Exception < public CustomException(string message) < >> private static void TestThrow()

После выдачи исключения среда выполнения проверяет, входит ли текущий оператор в блок try . Если да, она проверяет, может ли какой-либо из блоков catch , связанных с блоком try , перехватить исключение. Блоки Catch обычно задают типы исключений; если тип блока catch совпадает с типом или базовым классом исключения, блок catch может обработать этот метод. Пример:

try < TestThrow(); >catch (CustomException ex)

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

Читайте также:  Javascript удалить все теги

Оператор try может содержать не один блок catch . Выполняется первый оператор catch , который может обработать исключение; все последующие операторы catch игнорируются, даже если они совместимы. Упорядочить блоки catch от наиболее конкретных (или наиболее производных) до наименее конкретных. Пример:

using System; using System.IO; namespace Exceptions < public class CatchOrder < public static void Main() < try < using (var sw = new StreamWriter("./test.txt")) < sw.WriteLine("Hello"); >> // Put the more specific exceptions first. catch (DirectoryNotFoundException ex) < Console.WriteLine(ex); >catch (FileNotFoundException ex) < Console.WriteLine(ex); >// Put the least specific exception last. catch (IOException ex) < Console.WriteLine(ex); >Console.WriteLine("Done"); > > > 

Прежде чем выполнять блок catch , среда выполнения проверяет наличие блоков finally . Блоки Finally позволяют программисту удалить любое неоднозначное состояние, которое может остаться после прерванного блока try , а также освободить любые внешние ресурсы (включая обработчики графики, соединители баз данных или файловые потоки), не дожидаясь, пока сборщик мусора в среде выполнения завершит эти объекты. Пример:

static void TestFinally() < FileStream? file = null; //Change the path to something that works on your machine. FileInfo fileInfo = new System.IO.FileInfo("./file.txt"); try < file = fileInfo.OpenWrite(); file.WriteByte(0xF); >finally < // Closing the file allows you to reopen it immediately - otherwise IOException is thrown. file?.Close(); >try < file = fileInfo.OpenWrite(); Console.WriteLine("OpenWrite() succeeded"); >catch (IOException) < Console.WriteLine("OpenWrite() failed"); >> 

Если WriteByte() вызывает исключение, то код во втором блоке try , который пытается повторно открыть файл, завершится ошибкой, если file.Close() не вызывается, а файл остается заблокированным. Поскольку блоки finally выполняются, даже если выдается исключение, блок finally в предыдущем примере обеспечивает правильное закрытие файла и помогает избежать ошибки.

Если после выдачи исключения обнаружить совместимый блок catch в стеке вызовов не удается, происходит одно из трех:

  • Если исключение возникает в методе завершения, он прерывается, и вызывается базовый метод завершения (если есть).
  • Если стек вызовов содержит статический конструктор или инициализатор статического поля, выдается исключение TypeInitializationException, а исходное исключение назначается свойству InnerException нового исключения.
  • Как только достигается начало потока, он прерывается.
Читайте также:  Javascript clear all input

Источник

Exceptions and Exception Handling

The C# language’s exception handling features help you deal with any unexpected or exceptional situations that occur when a program is running. Exception handling uses the try , catch , and finally keywords to try actions that may not succeed, to handle failures when you decide that it’s reasonable to do so, and to clean up resources afterward. Exceptions can be generated by the common language runtime (CLR), by .NET or third-party libraries, or by application code. Exceptions are created by using the throw keyword.

In many cases, an exception may be thrown not by a method that your code has called directly, but by another method further down in the call stack. When an exception is thrown, the CLR will unwind the stack, looking for a method with a catch block for the specific exception type, and it will execute the first such catch block that it finds. If it finds no appropriate catch block anywhere in the call stack, it will terminate the process and display a message to the user.

In this example, a method tests for division by zero and catches the error. Without the exception handling, this program would terminate with a DivideByZeroException was unhandled error.

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("divided by = ", a, b, result); > catch (DivideByZeroException) < Console.WriteLine("Attempted divide by zero."); >> > 

Exceptions Overview

Exceptions have the following properties:

  • Exceptions are types that all ultimately derive from System.Exception .
  • Use a try block around the statements that might throw exceptions.
  • Once an exception occurs in the try block, the flow of control jumps to the first associated exception handler that is present anywhere in the call stack. In C#, the catch keyword is used to define an exception handler.
  • If no exception handler for a given exception is present, the program stops executing with an error message.
  • Don’t catch an exception unless you can handle it and leave the application in a known state. If you catch System.Exception , rethrow it using the throw keyword at the end of the catch block.
  • If a catch block defines an exception variable, you can use it to obtain more information about the type of exception that occurred.
  • Exceptions can be explicitly generated by a program by using the throw keyword.
  • Exception objects contain detailed information about the error, such as the state of the call stack and a text description of the error.
  • Code in a finally block is executed regardless of if an exception is thrown. Use a finally block to release resources, for example to close any streams or files that were opened in the try block.
  • Managed exceptions in .NET are implemented on top of the Win32 structured exception handling mechanism. For more information, see Structured Exception Handling (C/C++) and A Crash Course on the Depths of Win32 Structured Exception Handling.

C# Language Specification

For more information, see Exceptions in the C# Language Specification. The language specification is the definitive source for C# syntax and usage.

See also

Источник

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

Функции обработки исключений в языке 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("divided by = ", 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#.

Источник

Оцените статью