Блоки try-catch

Для того чтобы организовать в своей программе С# обработку ошибок с использова­нием исключений, нужно применить блоки, созданные при помощи ключевых слов try, catch и finally. Создание исключения (или, как еще говорят, передачу или возбуждение исключения) выполняют с помощью ключевого слова throw.

В блок try заключается код, который может вызвать возникновение ошибок, т. с. «ненадежный» код. Следом за блоком try может располагаться один или не­сколько блоков catch, в которых находится код для обработки ошибок.

Рассмотрим пример обработки ошибки деления на нуль с помощью исключений

using System;

namespace DivideByZeroEx

{

class DivByZeroExApp

static void Main(string[] args)

{

int i = 0;

try

{

int j = 5 / i; }

-atch (System. Exception ex) (

Console. WriteLine(

">» Ошибка в программе {0} [{!) ] nn{2} " , ex. Source, ex. Mas sage, ex. StackTrace) ; }

Console . ReadLine ( ) ;

}

}

}

Здесь мы заключили в блок try строку программы, при выполнении которой мо­жет произойти ошибка деления на нуль:

Try

{

int j = 5 / i;

}

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

Если же в процессе выполнения какой-либо программной строки возникает ошиб­ка, нормальная последовательность работы программы прерывается и управление пе­редается ближайшему блоку catch, расположенному вслед за блоком try. Вот как в нашей программе выглядит блок catch, предназначенный для обработки ошибки деления на нуль:

using System;

namespase DivByZeroEx

{

class DivByZeroExApp

{

static void Main(string[] args)

{

int i = 0;

try

{

int j = 5 / i;

}

catch (System.Exception ex)

{

Console.WriteLine(“>>>Щшибка в программе {0} [{1}]nn{2}”)

ex.Sourse, ex.Message, ex.StackTrace);

}

Console.ReadLine();

}

}

}

Здесь мы заключили в блок try строку программы, при выполнении которой мо­жет произойти ошибка деления на нуль:

int j = 5 / i;

}

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

Если же в процессе выполнения какой-либо программной строки возникает ошибка, нормальная последовательность работы программы прерывается и управление передается ближайшему блоку catch, расположенному вслед за блоком try. Вот как в нашей программе выглядит блок catch, предназначенный для обработки ошибки деления на нуль:

catch(System.Exception ex) {

Console.WriteLine(“>>>Щшибка в программе {0} [{1}]nn{2}”)

ex.Sourse, ex.Message, ex.StackTrace);

В круглых скобках после ключевого слова catch указывается тип (класс) обраба­тываемого исключения. В данном случае мы указали базовый класс System.Ex­ception, от которого «происходят» все остальные классы обработки исключений.

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

Вслед за обозначением класса обрабатываемого исключения мы указали имя пере­менной ex. Когда блок catch получает управление, эта переменная содержит ссылку на объект класса System-Exception. Свойства этого класса содержат информацию, которая может оказаться полезной при обработке исключения:

• свойство System. Exception . Source содержит название программы, в которой произошло исключение;

• в свойстве Sy stem. Except ion. Message хранится текст сообщения об ошибке;

• свойство System. Except ion. StackTrace содержит точную информацию о том, в каком месте программы произошло исключение.