Конструкторы (2 из 4):
1. Инициализирует новый экземпляр класса Exception.
public Exception();
2. Инициализирует новый экземпляр класса Exception с заданным сообщением об ошибке.
public Exception (string);
[C++] public: Exception(String*);
[JScript] public function Exception(String);
В классе Exception определен ряд свойств:
Message | Содержит строку, которая описывает причину ошибки |
StackTrace | Содержит имя класса и метода, вызвавшего исключение |
TargetSite | Содержит имя метода, из которого было вызвано исключение |
Source | Содержит имя программы, вызвавшей исключение |
HelpLink | Строка с любой дополнительной информацией |
Методы:
Метод ToString() возвращает строку с описанием исключения.
Пример 1:
try
{
double d = double.Parse(Console.ReadLine());
}
catch (Exception e)
{
Console.WriteLine ("Полное описание: " + e); //вызов ToString
Console.WriteLine ("Сообщение об ошибке: " + e.Message);
Console.WriteLine ("Имя класса и метода: " + e.StackTrace);
Console.WriteLine ("Метод: " + e.TargetSite);
}
Пример 2:
public static void Main()
{
int[ ] а = new int[4];
try
{
for ( int i = 0; i < 10; i++)
а[i] = i;
}
catch (IndexOutOfRangeException)
{
Console.WriteLine ("Индекс вне диапазона!");
return;
}
}
Пример 3:
public static void Main()
{
try
{
Class1.Divide(a, b);
}
catch (DivideByZeroException)
{
Console.WriteLine("Делитель равен 0");
b = 1;
}
}
Пример 4.
public static void Main()
{
try
{
double c = double.Parse(Console.ReadLine());
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.Message);
return;
}
}
Использование нескольких catch-блоков
С try-блоком можно связать не один, а несколько catch-блоков.
Однако все catch- блоки должны перехватывать исключения различного типа.
using System;
class Demo
{
public static void Main()
{
// Здесь массив a длиннее массива b.
int[] a = { 4, 8, 10, 32, 64, 128, 256, 512 };
int[] b = { 2, 0, 1, 4, 0, 8 };
for (int i = 0; i < a.Length; i++)
{
try
{
Console.WriteLine(a[i] + " / " + b[i] + " равно " + a[i] / b[i]);
}
catch (DivideByZeroException)
{
Console.WriteLine("Деление на ноль!");
}
catch (IndexOutOfRangeException)
{
Console.WriteLine("Выход за границы массива.");
return;
}
}
}
}
В общем случае catch-выражения проверяются в том порядке, в котором они встречаются в программе.
Выполняется только инструкция, тип исключения которой совпадает со сгенерированным исключением. Все остальные catch-блоки игнорируются.
catch-блок, предназначенный для "глобального перехвата" должен быть последним в последовательности catch-блоков.
Вложение try-блоков
Один try-блок можно вложить в другой. Исключение, сгенерированное во внутреннем try-блоке и не перехваченное catch-инструкцией, которая связана с этим try-блоком, передается во внешний try-блок.
Пример.
В следующей программе исключение типа IndexOutOfRangeException перехватывается не внутренним try-блоком, а внешним.
using System;
class Demo
{
public static void Main()
{
// Здесь массив a длиннее массива b.
int[] a = { 4, 8, 16, 32, 64, 128, 256, 512 };
int[] b = { 2, 0, 4, 4, 0, 8 };
try
{ // Внешний try-блок.
for (int i = 0; i < a.Length; i++)
{
try
{ // Вложенный try-блок.
Console.WriteLine (a[i] + " / " + b[i] + " = " + a[i] / b[i]);
}
catch (DivideByZeroException)
{
Console.WriteLine ("На ноль делить нельзя!");
}
}
}
catch (IndexOutOfRangeException)
{
Console.WriteLine ("Нет соответствующего элемента.");
Console.WriteLine ("Неисправимая ошибка. " +
"Программа завершена.");
return;
}
. . . . . . . . . .
}
}
Исключение, которое может быть обработано внутренним try-блоком (в данном случае это деление на нуль), позволяет программе продолжать работу.
Однако нарушение границ массива перехватывается внешним try-блоком и заставляет программу завершиться.
Внешние try-блоки можно также использовать в качестве механизма "глобального перехвата" для обработки тех ошибок, которые не перехватываются внутренними блоками.
Использование блока finally
Возникновение и обработка исключения, как правило, приводит к нетипичному завершению программы. При этом в программе могут остаться неосвобожденные ресурсы, например, открытые файлы.
Для освобождения ресурсов используют блок finally.
Этот блок должен следовать за блоком try или catch. Последний является необязательным.
Формат:
try
{
// Блок кода, предназначенный для обработки ошибок.
}
catch (ExcepTypel exOb)
{
// Обработчик для исключения типа ExcepTypel.
}
catch (ExcepType2 exOb)
{
// Обработчик для исключения типа ЕхсерТуре2.
}
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
finally
{
// Код завершения обработки исключений.
}
Блок finally будет выполнен в любом случае – было сгенерировано исключение или нет.
Блок finally не может быть определен без блока try. Эта пара (как правило, с блоками catch) может находиться и внутри вызываемого метода.
В одной программе (методе) может быть несколько блоков finally. Все эти блоки будут выполнены после своих try-блоков.
Пример.
public static void Main()
{
try
{
double c = double.Parse(Console.ReadLine());
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.Message);
return;
}
finally
{
Console.WriteLine("Здесь освобождаются ресурсы." +
"Блок выполняется всегда");
}
}
Дата: 2019-02-02, просмотров: 273.