Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Последствия «не перехвата» исключений

Поиск

 

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

Например, если убрать из предыдущего примера исключение FormatException, то при вводе некорректной строки, IDE-среда Visual Studio 2010 выдаст предупреждающее сообщение:

 

Рис. 3. 1. Сгенерированное исключение выловленное средой разработки Visual Studio 2010

 

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

 

Класс «Exception»

Класс «Exception»

 

Класс «Exception»

 

Все определяемые на уровне пользователя и системы исключения в C# в конечном итоге всегда наследуются от базового класса System.Exception, который, в свою очередь, наследуется от класса System.Object. Ниже показано, как в целом выглядит этот (обратим внимание, что некоторые его члены являются виртуальными и, следовательно, могут переопределяться в производных классах):

 

public class Exception: ISerializable, _Exception

{

// Общедоступные конструкторы

public Exception(string message, Exception innerException);

public Exception(string message);

public Exception();

//...

// Методы

public virtual Exception GetBaseException();

public virtual void GetObjectData(Serializationlnfо info, StreamingContext context);

// Свойства

public virtual IDictionary Data { get; }

public virtual string HelpLink (get; set; }

public Exception InnerException (get; }

public virtual string Message { get; }

public virtual string Source { get; set; }

public virtual string StackTrace { get; }

public MethodBase TargetSite { get; }

//...

}

 

Нетрудно заметить, что многие из содержащихся в System.Exception свойств являются по своей природе доступными только для чтения. Это объясняется тем, что для каждого из них значения, используемые по умолчанию, обычно поставляются в производных классах. Например, в производном классе IndexOutOfRangeException поставляется сообщение по умолчанию «Index was outside the bounds of the array» («Индекс вышел за границы массива»).

 

В следующей таблице приведено краткое описание некоторых наиболее важных свойств класса System.Exception:

 

Свойство Описание
Data Это свойство, доступное только для чтения, позволяет извлекать коллекцию пар «ключ/значение» (представленную объектом, реализующим интерфейс IDictionary), которая предоставляет дополнительную определяемую программистом информацию об исключении. По умолчанию эта коллекция является пустой
HelpLink Это свойство позволяет получать или устанавливать URL-адрес, по которому доступен справочный файл или веб-сайт с детальным описанием ошибки
InnerException Это свойство, доступное только для чтения, может применяться для получения информации о предыдущем исключении или исключениях, которые послужили причиной возникновения текущего исключения. Запись предыдущих исключений осуществляется путем их передачи конструктору самого последнего исключения
Message Это свойство, доступное только для чтения, возвращает текстовое описание соответствующей ошибки. Само сообщение об ошибке задается в передаваемом конструктору параметре
Source Это свойство позволяет получать или устанавливать имя сборки или объекта, который привел к выдаче исключения
StackTrace Это свойство, доступное только для чтения, содержит строку с описанием последовательности вызовов, которая привела к возникновению исключения. Как нетрудно догадаться, это свойство очень полезно во время отладки или для сохранения информации об ошибке во внешнем журнале ошибок
TargetSite Это свойство, доступное только для чтения, возвращает объект MethodBase с описанием многочисленных деталей метода, который привел к выдаче исключения (вызов вместе с ним метод ToSting позволяет идентифицировать этот метод по имени)

 

Давайте рассмотрим пример:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace LC_Console

{

class Program

{

static int MyDel(int x, int y)

{

return x / y;

}

 

static void Main()

{

link1:

try

{

Console.Write("Введите x: ");

int x = int.Parse(Console.ReadLine());

Console.Write("Введите y: ");

int y = int.Parse(Console.ReadLine());

 

int result = MyDel(x, y);

Console.WriteLine("Результат: " + result);

}

// Обрабатываем исключение возникающее при делении на ноль

catch (DivideByZeroException ex)

{

Console.WriteLine("Деление на \"0\" зафиксировано.\n");

Console.WriteLine("Ошибка: " + ex.Message + "\n\n");

goto link1;

}

// Обрабатываем исключение при неккоректном вводе числа в консоль

catch (FormatException ex)

{

Console.WriteLine("Было введено не число.\n");

Console.WriteLine("Ошибка: " + ex.Message + "\n\n");

goto link1;

}

Console.WriteLine("Для продолжения нажмите любую клавишу...");

Console.ReadKey();

}

}

}

 

Рис. 1. 1. Результат работы кода выше

 

Как видим, в данном примере используется свойство Message, класса Exception, для вывода информации о возникшем исключении.

 



Поделиться:


Последнее изменение этой страницы: 2016-08-15; просмотров: 371; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.219.44.171 (0.008 с.)