Поиск

Конструирование объекта Exception

На момент написания этой книги для класса System.Exception существовало четыре различных конструктора:

public Exception ();
public Exception(String);
protected Exception(SerializationInfo, StreamingContext);
public Exception(String, Exception);

Первый используется по умолчанию. У него нет аргументов, и он просто устанавливает переменные-члены по умолчанию. Такое исключение обычно передается так:

// Обнаружена ошибка, throw new ExceptionQ;

Единственный аргумент второго конструктора — строковое значение, представляющее сообщение об ошибке — именно эту форму вы встречали в большинстве примеров этой главы. Код, уловивший исключение, получает это сообщение через свойство System.Exception.Message. Вот пример обеих частей, участвующих в обработке исключения:

using System;
class ThrowExceptionS {
class FileOps {
public void FileOpen(String fileName) {
// ...
throw new Exception("Hy достали...");
}
public void FileReadQ
{
}
}
public static void MainQ {
// Код, улавливающий исключение.
try
{
FileOps fileOps = new FileOpsO;
fileOps.FileOpen("c:\test.txt"); fileOps. FileReadO; >
catch(System.Exception e) <
Console.WriteLine(e.Message); } } }

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

Чтобы облегчить участь клиентов вашего класса, вы решили передавать только один тип исключений. В этом случае клиенту нужно будет улавливать только одно исключение и связываться со свойством Inner-Exception исключения. Здесь есть дополнительное преимущество: если вы решите изменить данный метод, чтобы он передавал новый тип исключения, когда клиентский код уже написан, клиенту ничего не нужно менять, если он не захочет чего-то особенного от этого исключения.

В следующем коде клиент улавливает на верхнем уровне System.Exception и выводит сообщение, содержащееся во внутреннем объекте-исключении. Если когда-нибудь метод DoWork будет передавать другие типы исключений (через внутреннее исключение объекта System.Exception), клиентский код будет продолжать работать.

using System;
using System.Globalization;
class FooLib
{
protected bool IsValidParam(string value)
{
bool success = false;
if (value.Length == 3)
{
char c1 = value[0]; if (Char.IsNumber(cD)
{
char c2 = value[2]; if (Char.IsNumber(c2))
{
if (value[1] == '.')
success = true; } > >
return success; }
public void DoWork(string value)
<
if (!IsValidParam(value))throw new Exception
("", new FormatExceptionC'yKaaaH недопустимый "+
"параметр"));
Console.WriteLine("Выполнено с кодом '{0}'", value); > }
class FooLibClientApp
{
public static void Main(string[] args)
{
FooLib lib = new FooLibO;
try
{
lib.DoWork(args[0]);
}
catch(Exception e)
{
Exception inner = e.InnerException;
k
Console.WriteLine(inner.Message); } >
>