Принципы объектно-ориентированного программирования

         

Проблемы создания блоков catch



Проблемы создания блоков catch

Единственное, что должно быть в блоке catch, — это код, хотя бы частично обрабатывающий уловленное исключение. Например, можно произвести некоторые действия, возможные на момент получения исключения, и повторно передать его, чтобы была возможной его дальнейшая обработка. Это иллюстрирует следующий пример. Foo вызывает Ваг, который работает с БД. Поскольку используются транзакции, Ваг должен улавливать любую возникающую ошибку и откатывать незафиксированные изменения, прежде чем передать исключение наверх методу Foo. using System;



class WhenToCatchApp {

public void Foo() {

try {

Bar(); }

catch(Exception e) {

Console.WriteLine(e.Message); } }

public void Bar() {

try {

// Вызов метода, устанавливающего "границы фиксации" Console.WriteLine("устанавливает границу фиксации");

// Call Baz to save data.

Console.WriteLine("вызываем Baz для сохранения данных");

Baz();

Console.WriteLine("фиксируем сохраненные данные"); } catch(Exception)

{

// В данном случае Bar следует уловить исключение, // поскольку он делает нечто существенное //(откатывает незафиксированные изменения в БД).

Console.WriteLine("Откатываем незафиксированные "+

"изменения и затем повторно передаем исключение");

throw; > }

public void BazQ {

throw new ExceptionC'e Baz ошибка при работе с БД");

>

public static void MainQ

{

WhenToCatchApp test = new WhenToCatchAppQ; test.Foo(); // Этот метод в конечном счете выведет

// сообщение об ошибке. > }

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



Содержание раздела