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

Необходимо реализовать возможность единообразной обработки приложениями ошибок, происходящих во время выполнения. Среда .NET предоставляет модель для единообразного уведомления приложений об ошибках: операции .NET информируют о сбое посредством выдачи исключений.

Исключения

Исключение — это любое состояние ошибки или непредвиденное поведение, возникающее при выполнении программы. Исключения могут возникать из-за сбоя в вашем или вызываемом коде (например, в общей библиотеке), недоступности ресурсов ОС, неожиданных состояний, возникающих в среде выполнения (например, код, который невозможно проверить) и по другим причинам. После некоторых из этих состояний приложение может восстановиться, после других — нет. В большинстве случаев вы можете выполнить восстановление после большинства исключений в приложении, но не после исключений среды выполнения.

В .NET исключение — это объект, наследуемый от класса System.Exception. Исключение создается из области кода, где произошла проблема. Исключение передается вверх по стеку до тех пор, пока его не обработает приложение либо программа не завершится.

Исключения и традиционные методы обработки ошибок

Традиционно модели обработки ошибок разных языков программирования основываются либо на уникальном для языка способе обнаружения ошибок и отыскании для них обработчиков, либо на механизме обработки ошибок, предоставляемом операционной системой. Способ обработки исключений, реализуемый в .NET, обладает следующими преимуществами:

  • Создание и обработка исключений работают одинаково для языков программирования .NET.

  • Не требует определенного синтаксиса языка для обработки исключений, а позволяет каждому языку определить собственный синтаксис.

  • Исключения можно создавать между разными процессами и даже компьютерами.

  • В приложение можно добавить код обработки исключений для повышения надежности программы.

Исключения обеспечивают ряд преимуществ по сравнению с другими методами уведомления об ошибках, например кодами возврата. Сбои не остаются незамеченными, так как среда выполнения завершает работу приложения при наличии необработанного исключения. Недопустимые значения не распространяются по системе из-за того, что код не способен выполнить проверку кода возврата ошибки.

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

В следующей таблице перечислены некоторые общие исключения с примерами возможных причин.

Тип исключения Описание Пример
Exception Базовый класс для всех исключений. Отсутствует (используйте производный класс этого исключения).
IndexOutOfRangeException Вызывается средой выполнения только при неправильной индексации массива. Индексирование массива вне допустимого диапазона:
arr[arr.Length+1]
NullReferenceException Вызывается средой выполнения только в том случае, если имеется ссылка на пустой объект. object o = null;
o.ToString();
InvalidOperationException Вызывается методами в недопустимом состоянии. Вызов Enumerator.MoveNext() после удаления элемента из базовой коллекции.
ArgumentException Базовый класс для всех исключений аргументов. Отсутствует (используйте производный класс этого исключения).
ArgumentNullException Вызывается методами, которые не допускают пустой аргумент. String s = null;
"Calculate".IndexOf(s);
ArgumentOutOfRangeException Вызывается методами, проверяющими попадание аргументов в заданный диапазон. String s = "string";
s.Substring(s.Length+1);

См. также