русс | укр

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

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

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

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


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

Генерация собственных исключений


Дата добавления: 2013-12-23; просмотров: 810; Нарушение авторских прав


До сих пор мы рассматривали исключения, которые генерирует среда, но сгенерировать исключение может и сам программист. Для этого необходимо воспользоваться оператором throw, указав параметры, определяющие вид исключения. Параметром должен быть объект, порожденный от стандартного класса System.Exception. Этот объект используется для передачи информации об исключении обработчику.

static void Main(){ try { int x = int.Parse(Console.ReadLine()); if (x < 0) throw new Exception(); //1 Console.WriteLine("ok"); } catch { Console.WriteLine("введено недопустимое значение"); }}

В строчке 1 c помощью команды new был создан объект исключения типа Exception. При необходимости можно генерировать исключение любого типа.

При генерации исключения можно определить сообщение, которое будет "выбрасываться" обработчиком исключений. Например:

static void Main(){ try { int x = int.Parse(Console.ReadLine()); if (x < 0) throw new Exception("введено недопустимое значение"); //1 Console.WriteLine("ok"); } catch (Exception error) { Console.WriteLine(error.Message); } }

7.4 Приемы использования обработчиков исключений

Рассмотрим несколько полезных приемов использования обработчиков исключений.

Пример 1. Один try-блок можно вложить в другой. Исключение, сгенерированное во внутреннем try-блоке и не перехваченное catch-инструкцией, которая связана с этим try-блоком, передается во внешний try-блок. Например, в следующей программе исключение типа ArithmeticException перехватывается не внутренним try-блоком, а внешним.

static void Main(){ Console.WriteLine("a="); byte a = byte.Parse(Console.ReadLine()); Console.WriteLine("b="); byte b = byte.Parse(Console.ReadLine()); int f=1; try //Внешний блок-try { for (byte i = a; i <= b; ++i) { try //Внутренний блок-try { f=checked((int)(f*i)); Console.WriteLine("y({0})={1:f6}", i, 100 / (f - 1)); } catch (DivideByZeroException) { Console.WriteLine("y({0})=Деление на 0", i); } } } catch (ArithmeticException) { Console.WriteLine("ERROR"); }}

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



Пример 2. Исключение, перехваченное одной catch-инструкцией, можно сгенерировать повторно, чтобы обеспечить возможность его перехвата другой (внешней) catch-инструкцией. Это позволяет нескольким обработчикам получить доступ к исключению.

static void genException (){ Console.WriteLine("a="); double a = double.Parse(Console.ReadLine()); Console.WriteLine("b="); double b = double.Parse(Console.ReadLine()); int f = 1; try //Внешний блок-try { for (double i = a; i <= b; ++i) { try //Внутренний блок-try { f = checked((int)(f * i)); Console.WriteLine("y({0})={1:f6}", i, 100 / (f - 1)); } catch (DivideByZeroException) { Console.WriteLine("y({0})=Деление на 0", i); } } } catch (ArithmeticException) { Console.WriteLine("ERROR"); throw ; //повторная генерация исключения }} static void Main(){ try { genException(); } catch { Console.WriteLine("НЕИСПРАВИМАЯ ОШИБКА!!!"); }}

Нужно помнить, что при повторном генерировании исключения оно не будет повторно перехватываться той же catch-инструкцией, а передается следующей (внешней) catch-инструкции.

Задания.

  1. Объясните почему не было сгенерировано исключение DivideByZeroException.
  2. Сгенерируйте собственное исключение DivideByZeroException и его обработку для ситуации f-1<0.000001.

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

Замечание. Иногда возникает потребность в обязательном выполнении каких-то действий, которые должны выполниться по выходу из try/catch-блока. Например, генерируется исключение и происходит преждевременное завершение выполнения программного фрагмента, но при этом остается открытым файл. Для выхода из такой ситуации С# предоставляет блок finally, который добавляется после всех блоков catch.

static void Main(){ for (int i = 0; i < 5; i++) { try { Console.WriteLine("Введите два числа"); int a = int.Parse(Console.ReadLine()); int b = int.Parse(Console.ReadLine()); Console.WriteLine(a+"/"+b+"="+a/b); } catch (FormatException) { Console.WriteLine("Нужно ввести число!"); } catch (DivideByZeroException) { Console.WriteLine("Делить на нуль нельзя!"); } catch { Console.WriteLine("Какая-то ошибка"); } finally { Console.WriteLine("после try-блока"); } }}

Задание. Протестируйте данную программу, вводя поочередно следующие значения:

a=4, b=2a=3, b=ga=d, b=1a=2, b=0,a=123456789987654321, b=1

 

Самостоятельная работа



<== предыдущая лекция | следующая лекция ==>
Теоретический материал | Вычисление конечных сумм и произведений


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


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

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

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


 


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

 
 

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

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