русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Обработка исключений


Дата добавления: 2015-07-09; просмотров: 579; Нарушение авторских прав


Пусть в классе объявляются методы A и B.

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

Если всё хорошо, метод A, возможно, анализирует полученные результаты и продолжает свою работу непосредственно из точки возврата.

Если при выполнении метода B возникла исключительная ситуация (например, целочисленное деление на 0), возможно, что метод A узнает об этом, анализируя возвращаемое из B значение. Таким может быть один из сценариев “обратной связи”, при котором вызывающий метод узнаёт о результатах деятельности вызывающего метода.

Недостатки этого сценария заключаются в том, что:

§ метод B может в принципе не возвращать никаких значений,

§ среди множества возвращаемых методом B значений невозможно выделить подмножество значений, которые можно было бы воспринимать как уведомление об ошибке,

§ работа по подготовке уведомления об ошибке требует неоправданно больших усилий.

 

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

Некорректная ситуация в ходе выполнения программы (деление на нуль, выход за пределы массива) рассматривается как исключительная ситуация, на которую метод, в котором она произошла, реагирует ГЕНЕРАЦИЕЙ ИСКЛЮЧЕНИЯ, а не обычным возвращением значения, пусть даже изначально ассоциированного с ошибкой.

Среда выполнения создает объект для представления исключения при его возникновении. Одновременно с этим прерывается обычный ход выполнения программы. Происходит так называемое разматывание стека, при котором управление НЕ оказывается в точке возврата и если ни в одном из методов, предшествующих вызову, не было предпринято предварительных усилий по ПЕРЕХВАТУ ИСКЛЮЧЕНИЯ, приложение аварийно завершается.



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

Все языки программирования, использующие среду выполнения, обрабатывают исключения одинаково. В каждом языке используется форма try/catch/finally для структурированной обработки исключений.

Следующий пример демонстрирует основные принципы организации генераторов и перехватчиков исключений.

 

using System;

 

// Объявление собственного исключения.

// Наследуется базовый класс Exception.

public class xException:Exception

{

// Собственное исключение имеет специальную строчку

// и в этом её отличие.

public string xMessage;

 

// Кроме того, в поле её базового элемента

// также фиксируется особое сообщение.

public xException(string str):base("xException is here...")

{

xMessage = str;

}

 

}

 

// Объявление собственного исключения.

// Наследуется базовый класс Exception.

public class MyException:Exception

{

// Собственное исключение имеет специальную строчку

// и в этом её отличие.

public string MyMessage;

 

// Кроме того, в поле её базового элемента

// также фиксируется особое сообщение.

public MyException(string str):base("MyException is here...")

{

MyMessage = str;

}

}

 

public class StupidCalcule

{

public int Div(int x1, int x2)

{

// Вот здесь метод проверяет коррактность операндов и с помощью оператора

// throw возбуждает исключение.

if (x1 != 0 && x2 == 0)

throw new Exception("message from Exception: Incorrect x2!");

else if (x1 == 0 && x2 == 0)

throw new MyException("message from MyException: Incorrect x1 && x2!");

else if (x1 == -1 && x2 == -1)

throw new xException("message from xException: @#$%*&^???");

 

// Если же ВСЁ ХОРОШО, счастливый заказчик получит ожидаемый результат.

return (int)(x1/x2);

}

}

 

 

public class XXX

{

 

public static void Main()

{

int ret;

StupidCalcule sc = new StupidCalcule();

 

// Наше приложение специально подготовлено к обработке исключений!

// Потенциально опасное место (КРИТИЧЕСКАЯ СЕКЦИЯ) ограждено

// (заключено в блок try)

try

{

// Вызов...

ret = sc.Div(-1,-1);

// Если ВСЁ ХОРОШО - будет выполнен оператор Console.WriteLine.

// Потом операторы блока finally, затем операторы за пределами

// пределами блоков try, catch, finally.

Console.WriteLine("OK, ret == {0}.", ret.ToString());

}

catch (MyException e)

{

// Здесь перехватывается MyException.

Console.WriteLine((Exception)e);

Console.WriteLine(e.MyMessage);

}

// Если этот блок будет закомментирован -

// возможные исключения типа Exception и xException

// окажутся неперехваченными. И после блока

// finally приложение аварийно завершится.

catch (Exception e)

{

// А перехватчика xException у нас нет!

// Поэтому в этом блоке будут перехватываться

// все ранее неперехваченные потомки исключения Exception.

// Это последний рубеж.

// Ещё один вариант построения последнего рубежа

// вылядит так:

// catch

//{

// Операторы обработки - сюда.

//}

Console.WriteLine(e);

}

finally

{

// Операторы в блоке finally выполняются ВСЕГДА, тогда как

// операторы, расположенные за пределами блоков try, catch, finally,

// могут и не выполниться вовсе.

Console.WriteLine("finally block is here!");

}

// Вот если блоки перехвата исключения окажутся не

// соответствующими возникшему исключению - нормальное

// выполнение приложения будет прервано - и мы никогда не увидим

// этой надписи.

Console.WriteLine("Good Bye!");

}

}

 



<== предыдущая лекция | следующая лекция ==>
Свойства | Массив. Объявление


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.385 сек.