* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна! RSS



Генерация исключений
8 февраля 2009

Весьма часто требуется генерировать исключения. В общем случае их можно под-
разделить на два типа:
• при возникновении ошибки периода выполнения, которую не удается обрабо-
тать полностью, После частичной обработки такой ошибки следует генериро-
вать исключение, чтобы передать ее по стеку для дальнейшей обработки;
* при работе компонента возникла недопустимая ситуация, которую не удается
разрешить локально. Об этом необходимо уведомить родительский компонент,
сгенерировав стандартное исключение .NET либо нестандартное исключение,
специфичное для данного компонента.
Оба данных случая подробно рассматриваются в этом разделе.
Повторная генерация исключений
Иногда структуре обработки исключений не удается полностью обработать возник-
шее исключение. Например, во время работы метода, выполняющего множество
сложных вычислений, иногда неожиданно возникает исключение Null Reference-
Exception. В этом случае успешная обработка исключения возможна, вероятен так-
же исход, когда это не удается. Ваш код должен проверить, в состоянии ли он обра-
ботать возникшее исключение. Если это не удается в контексте блока Catch (catch),
следует генерировать его повторно при помощи ключевого слова Throw (throw), на-
пример:
Visual Basic .NET
Try
Здесь должен быть код приложения,
Catch e As System.NullReferenceException
а сюда помещают код, который проверяет исключение и текущий контекс~,
чтобы определить, можно ли обработать исключение в данной блоке Catch,
или его нужно передать дальше по стеку. Если исключение нельзя
обработать локально, следующая строка генерирует исключение повторно
и передает его дальше по стеку.
Throw e
End Try
Visual C#
{
// Здесь должен быть код приложения,
}
catch (System.NullReferenceException e)
{
// а сюда помещают код, который проверяет исключение и текущий контекст,
// чтобы определить, можно ли обработать исключение в данном блоке Catch,
// передано выше по стеку. Если оно не может быть обработано локально.
// локально, следующая строка генерирует исключение повторно и передае"~
// его дальше по стеку.
throw e;
}
При использовании универсального блока Catch (catch), не предоставляющего
ссылку на объект исключения, полученное этим блоком исключение можно гене-
рировать повторно посредством ключевого слова Throw (throw), указав его без аргу-
ментов;
Visual Basic .NET
Это начало блока Catch.
Catch
Th row
Visual C#
// Это начало блока Catch.
catch
{
throw;
}
В некоторых случаях необходимо передать на следующий уровень приложения
дополнительные сведения. Для этого вместо повторной генерации возникшего ис-
ключения следует генерировать другое исключение, в этом случае второе исключе-
ние играет роль оболочки для первого. Ссылка на объект исходного исключения
записывается в свойство InnerException объекта нового исключения его конструкто-
ром. Этот прием позволяет передать с системным типом исключения дополнитель-
ные данные, записав их в соответствующие свойства нового исключения и помес-
тив исходное исключение в свойство fnner Exception. Ниже демонстрируется созда-
ние и генерация нового исключения, предоставляющего строку с подробным опи-
санием исходного исключения, оболочкой которого оно является:
Visual Basic .NET
Это начало блока Catch.
Catch e as NullReferenceException
Throw New NullReferenceException( "Widget A is not set", e)
Visual C#
// Это начало блока Catch.
catch (NullReferenceException e)
{
throw new NullReferenceException("Widget A is not set", e);
Как повторно генерировать исключение
чтобы повторно генерировать исключение, полученное блоком Catch (catch), вос-
пользуйтесь ключевым словом Throw (throw);
чтобы генерировать новое исключение, предоставляющее дополнительные све-
дения об исходном исключении, создайте объект исключения, являющийся обо-
лочкой для исходного исключения, и генерируйте новое исключение с помо-
щью ключевого слова Throw (throw).
Нестандартные исключения
При разработке компонентов иногда также требуется генерировать исключения.
Если во время работы компонента возникает недопустимая ситуация, следует гене-
рировать исключение для клиентского приложения. Для этих целей всегда исполь-
зуют нестандартные исключения, поскольку общеязыковая исполняющая среда ге-
нерирует исключение лишь в предопределенных исключительных ситуациях,
Примечание Согласно названию, исключения предназначены лишь для нестандар-
тных ситуаций. Не следует использовать их для взаимодействия между клиентом и
компонентами — для этого предназначены события. Исключения следует генери-
ровать, только когда продолжение нормального исполнения программы без внеш-
него вмешательства невозможно.
Нестандартные исключения можно создавать на основе класса System.Applitalion-
Exception. Это класс инкапсулирует всю необходимую функциональность, в том
числе свойства Message, StackTrace и InnerException, и может стать основой для не-
стандартных исключений, ориентированных на потребности вашего компонента.
Ниже показан пример нестандартного исключения, созданного на основе класса
Application Exception. Конструктор нового исключения требует фиктивный объект
Widget, поскольку новое исключение предоставляет доступ к этому объекту через
свойство, доступное только для чтения.
Visual Basic .NET
Public Class WidgetException
Inherits System.ApplicationException
Эта переменная хранит объект Widget.
Private mWidget As Widget.
' Это свойство служит для доступа к объекту Widget.
Public Readonly Property ErrorWidgetO As Widget
Get
Return mWidget
End Get
End Property
1 Этот конструктор принимает объект Widget и строку String, эти
' параметры можно использовать для описания контекста приложения
' на момент ошибки. Разрешается также создавать перегруженные версии
1 конструктора, поддерживающие различные наборы параметров.
Public Sub New(ByVal W As Widget, ByVal Message As String)
' Следующая строка вызывает конструктор из базового класса
1 и устанавливает свойство Message,
' унаследозанное от класса ApplicationException.
MyBase.New(Message)
1 Установить свойство Widget,
rnWidget - W
End Sub
End Class
Visual C#
public class WidgetException:Systerr.ApplicationException
{
// Эта переменная хранит объект Widget.
Widget mWidget;
public Widget ErrorWidget
{
get
{
return mWidget;
// Этот конструктор принимает объект Widget и строку String, эти
// параметры можно использовать для описания контекста приложения
// на момент ошибки, Разрешается также создавать перегруженные версии
// конструктора, поддерживающие различные наборы параметров.
//
// Следующая строка вызывает конструктор из базового класса
// и устанавливает свойство Message,
// унаследованное от класса ApplicationException.
public WidgetException(Widget W. string S) : base(S)
!
// Установить свойство Widget.
mWidget = W;
Объявив класс исключения, удается сгенерировать новый экземпляр этого клас-
са при возникновении недопустимой ситуации, например, так:
Visual Basic .NET
Dim Alpha As New Widget ()
Здесь должен быть код, повреждающий объект Widget с именем Alpha.
Throw New WitigetException(Alpha, "Widget Alpha is corrupt!")
Visual C#
Widget Alpha;
// Здесь должен быть код, повреждающий объект Widget с именем Alpha.
throw new WidgetException(Alpha, "Widget Alpha is corrupt!");
^ Как генерировать нестандартное исключение
1. Объявите класс нестандартного исключения. Он должен быть потомком Sys~
tem.ApplicationException и может содержать любые свойства, предоставляющие до-
полнительные данные клиентам, обрабатывающим исключения. Эти свойства
инициализируют в конструкторе класса нестандартного исключения.
2. При возникновении нештатной ситуации генерируйте новый экземпляр класса
нестандартного исключения при помощи ключевого слова Throw (throw), пере-
дав конструктору соответствующие параметры.

Теги: .NET

Статьи по теме:

Типы значений и ссылочные типы
Примеси (mixin)
Пошаговое исполнение кода
Применение GDI+
Редактор пользовательского интерфейса
Классы CTS
Конструкторы и деструкторы
Создание типизированного объекта DataSet с помощью XML Designer
Создание поддержки печати
Типы данных .NET Framework
Принципы дизайна интерфейса
Реализация полиморфизма через интерфейсы
Вложенные типы
Редактор реестра
Объявление методов
| .NET | Pavel |
 


Пн Вт Ср Чт Пт Сб Вс
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30


     



Rambler's Top100

Данный сайт или домен продается ICQ: 403-353-727

© 2009 Seoliga.ru | .NET | Генерация исключений. Регион сайта: Москва и Санкт-Петербург