Обработка и создание исключений в .NETHandling and throwing exceptions in .NET

Необходимо реализовать возможность единообразной обработки приложениями ошибок, происходящих во время выполнения.Applications must be able to handle errors that occur during execution in a consistent manner. Среда .NET предоставляет модель для единообразного уведомления приложений об ошибках: операции .NET информируют о сбое посредством выдачи исключений..NET provides a model for notifying applications of errors in a uniform way: .NET operations indicate failure by throwing exceptions.

ИсключенияExceptions

Исключение — это любое состояние ошибки или непредвиденное поведение, возникающее при выполнении программы.An exception is any error condition or unexpected behavior that is encountered by an executing program. Исключения могут возникать из-за сбоя в вашем или вызываемом коде (например, в общей библиотеке), недоступности ресурсов ОС, неожиданных состояний, возникающих в среде выполнения (например, код, который невозможно проверить) и по другим причинам.Exceptions can be thrown because of a fault in your code or in code that you call (such as a shared library), unavailable operating system resources, unexpected conditions that the runtime encounters (such as code that can't be verified), and so on. После некоторых из этих состояний приложение может восстановиться, после других — нет.Your application can recover from some of these conditions, but not from others. В большинстве случаев вы можете выполнить восстановление после большинства исключений в приложении, но не после исключений среды выполнения.Although you can recover from most application exceptions, you can't recover from most runtime exceptions.

В .NET исключение — это объект, наследуемый от класса System.Exception.In .NET, an exception is an object that inherits from the System.Exception class. Исключение создается из области кода, где произошла проблема.An exception is thrown from an area of code where a problem has occurred. Исключение передается вверх по стеку до тех пор, пока его не обработает приложение либо программа не завершится.The exception is passed up the stack until the application handles it or the program terminates.

Исключения и традиционные методы обработки ошибокExceptions vs. traditional error-handling methods

Традиционно модели обработки ошибок разных языков программирования основываются либо на уникальном для языка способе обнаружения ошибок и отыскании для них обработчиков, либо на механизме обработки ошибок, предоставляемом операционной системой.Traditionally, a language's error-handling model relied on either the language's unique way of detecting errors and locating handlers for them, or on the error-handling mechanism provided by the operating system. Способ обработки исключений, реализуемый в .NET, обладает следующими преимуществами:The way .NET implements exception handling provides the following advantages:

  • Создание и обработка исключений работают одинаково для языков программирования .NET.Exception throwing and handling works the same for .NET programming languages.

  • Не требует определенного синтаксиса языка для обработки исключений, а позволяет каждому языку определить собственный синтаксис.Doesn't require any particular language syntax for handling exceptions, but allows each language to define its own syntax.

  • Исключения можно создавать между разными процессами и даже компьютерами.Exceptions can be thrown across process and even machine boundaries.

  • В приложение можно добавить код обработки исключений для повышения надежности программы.Exception-handling code can be added to an application to increase program reliability.

Исключения обеспечивают ряд преимуществ по сравнению с другими методами уведомления об ошибках, например кодами возврата.Exceptions offer advantages over other methods of error notification, such as return codes. Сбои не остаются незамеченными, так как среда выполнения завершает работу приложения при наличии необработанного исключения.Failures don't go unnoticed because if an exception is thrown and you don't handle it, the runtime terminates your application. Недопустимые значения не распространяются по системе из-за того, что код не способен выполнить проверку кода возврата ошибки.Invalid values don't continue to propagate through the system as a result of code that fails to check for a failure return code.

Часто встречающиеся исключенияCommon exceptions

В следующей таблице перечислены некоторые общие исключения с примерами возможных причин.The following table lists some common exceptions with examples of what can cause them.

Тип исключенияException type ОписаниеDescription ПримерExample
Exception Базовый класс для всех исключений.Base class for all exceptions. Отсутствует (используйте производный класс этого исключения).None (use a derived class of this exception).
IndexOutOfRangeException Вызывается средой выполнения только при неправильной индексации массива.Thrown by the runtime only when an array is indexed improperly. Индексирование массива вне допустимого диапазона:Indexing an array outside its valid range:
arr[arr.Length+1]
NullReferenceException Вызывается средой выполнения только в том случае, если имеется ссылка на пустой объект.Thrown by the runtime only when a null object is referenced. object o = null;
o.ToString();
InvalidOperationException Вызывается методами в недопустимом состоянии.Thrown by methods when in an invalid state. Вызов Enumerator.MoveNext() после удаления элемента из базовой коллекции.Calling Enumerator.MoveNext() after removing an item from the underlying collection.
ArgumentException Базовый класс для всех исключений аргументов.Base class for all argument exceptions. Отсутствует (используйте производный класс этого исключения).None (use a derived class of this exception).
ArgumentNullException Вызывается методами, которые не допускают пустой аргумент.Thrown by methods that do not allow an argument to be null. String s = null;
"Calculate".IndexOf(s);
ArgumentOutOfRangeException Вызывается методами, проверяющими попадание аргументов в заданный диапазон.Thrown by methods that verify that arguments are in a given range. String s = "string";
s.Substring(s.Length+1);

См. такжеSee also