Создание пользовательских исключений, раз…

Создание пользовательских исключений, раз…

Всегда есть возможность генерировать экземпляр System.Exceptiоn, чтобы сигнализировать об ошибке времени выполнения (как показано в нашем первом примере), но часто бывает выгоднее построить строго типизированное исключение, которое предоставит уникальную информацию, характеризующую данную конкретную проблему. Предположим, например, что мы хотим создать пользовательское исключение (с именем CarIsDeadException), представляющее ошибку превышения скорости нашего обреченного автомобиля. Первым делом здесь должно быть создание нового класса из System.ApplicationException (по соглашению, классы исключений имеют суффикс "Exception", что в переводе означает "исключение").

// Это пользовательское исключение предлагает описание

// автомобиля, вышедшего из строя.

public class CarIsDeadException: ApplicationException {}

Как и в случае любого другого класса, можно определить пользовательские члены, которые будут затем использоваться в блоке catch в рамках программной логики вызовов. Точно так же можно переопределить любые виртуальные члены, определенные родительскими классами. Например, можно реализовать CarIsDeadException, переопределив виртуальное свойство Message.

public class CarIsDeadException: ApplicationException {

 private string messageDetails;

 public CarIsDeadException() {}

 public CarIsDeadException(string message) {

  messageDetails = message;

 }

 // Переопределение свойства Exception.Message.

 public override string Message {

  get {

   return string.Format("Сообщение об ошибке Car: {0}", messageDetails);

  }

 }

}

Здесь тип CarIsDeadException предлагает приватный член (messageDetails), представляющий информацию о текущем исключении, которая может быть задана с помощью пользовательского конструктора. Генерировать ошибку с помощью Accelerate() очень просто. Здесь следует разместить, сконфигурировать и сгенерировать тип CarIsDeadException, а не общий тип System.Exception.

// Генерируем пользовательское исключение CarIsDeadException.

public void Accelerate(int delta) {

 ...

 CarIsDeadException ex = new CarIsDeadException(string.Format("{0} перегрелся!", petName));

 ex.HelpLink = "http://www.CarsRUs.com";

 ex.Data.Add("Дата и время", string.Format("Автомобиль сломался {0}", DateTime.Now));

 ex.Data.Add("Причина", "У вас тяжелая нога.");

 throw ex;

}

Чтобы выполнить явный захват поступившего исключения, блок catch следует изменить для захвата конкретного типа CarIsDeadException (однако, с учетом того, что System.CarIsDeadException является потомком System.Exception, можно также выполнить захват объекта System.Exception общего вида).

static void Main (string[] args) {

 catch (CarIsDeadException e) {

  // Обработка поступившего исключения.

 }

}

Теперь, после рассмотрения основных этапов процесса создания пользовательских исключений, возникает вопрос: когда может потребоваться их создание? Как правило, пользовательские исключения требуется создавать только тогда, когда ошибка непосредственно связана с классом, генерирующим эту ошибку (например, пользовательский класс File может генерировать ряд исключений, связанных с доступом к файлам, класс Car может генерировать ряд исключений, связанных с работой автомобиля и т.д.). Тем самым вы обеспечиваете вызывающей стороне возможность обработки множества исключений на основе "индивидуального подхода".

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

7.2.6. Создание пользовательских цепочек в таблице filter

Из книги Iptables Tutorial 1.1.19 автора Andreasson Oskar

7.2.6. Создание пользовательских цепочек в таблице filter Итак, у вас перед глазами наверняка уже стоит картинка движения пакетов через различные цепочки, и как эти цепочки взаимодействуют между собой! Вы уже должны ясно представлять себе цели и назначение данного сценария.


Быстрый поиск переходов и создание пользовательских корзин

Из книги Видеосамоучитель монтажа домашнего видео в Adobe Premiere Pro CS3 автора Днепров Александр Г

Быстрый поиск переходов и создание пользовательских корзин Поиск нужного видеоперехода на вкладке Effects (Эффекты) занимает некоторое время. Необходимо отыскать папку группы перехода, открыть ее, найти нужный переход. Быстро найти нужный переход можно по его названию.1. В


Создание пользовательских исключений, два…

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Создание пользовательских исключений, два… Тип CarIsDeadException переопределяет свойство System.Exception.Message, чтобы установить пользовательское сообщение об ошибке. Однако задачу можно упростить, установив родительское свойство Message через входной параметр конструктора. В


Создание пользовательских исключений, три!

Из книги Word 2007.Популярный самоучитель автора Краинский И

Создание пользовательских исключений, три! Если вы хотите построить "педантично точный" пользовательский класс исключения, то созданный вами тип должен соответствовать лучшим образцам, использующим исключения .NET. В частности, ваше пользовательское исключение должно


Создание пользовательских индексаторов

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Создание пользовательских индексаторов Как программисты, мы прекрасно знаем, что с помощью индексов можно получить доступ к отдельным элементам, содержащимся в стандартном массиве.// Объявление массива целых значений.int[] myInts = {10, 9, 100, 432, 9874};// Использование операции [] для


Создание пользовательских подпрограмм преобразования

Из книги iOS. Приемы программирования автора Нахавандипур Вандад

Создание пользовательских подпрограмм преобразования В C# есть два ключевых слова, explicit и implicit, предназначенные для управления тем, как типы должны отвечать на попытки преобразования. Предположим, что у нас есть следующие определения структур.public struct Rectangle { // Открыты для


Создание пользовательских обобщенных коллекций

Из книги Программирование на языке Ruby автора Е.А. Роганов, Н.А. Роганова Е.А. Роганов, Н.А. Роганова

Создание пользовательских обобщенных коллекций Итак, пространство имен System.Collections.Generic предлагает множество типов, позволяющих создавать эффективные контейнеры, удовлетворяющие требованиям типовой безопасности. С учетом множества доступных вариантов очень велика


Создание пользовательских атрибутов

Из книги QT 4: программирование GUI на С++ автора Бланшет Жасмин

Создание пользовательских атрибутов Первым шагом процесса построения пользовательского атрибута является создание нового класса, производного от System.Attribute. В продолжение автомобильной темы, используемой в этой книге, мы создадим новую библиотеку классов C# с именем


Создание пользовательских элементов управления Windows Forms

Из книги автора

Создание пользовательских элементов управления Windows Forms Платформа .NET предлагает для разработчиков очень простой способ создания пользовательских элементов интерфейса. В отличие от (теперь уже считающихся устаревшими) элементов управления ActiveX, для элементов


Создание пользовательских диалоговых окон

Из книги автора

Создание пользовательских диалоговых окон Теперь, когда вы понимаете роль базовых элементов управления Windows Forms и суть процесса построения пользовательских элементов управления, давайте рассмотрим вопрос создания пользовательских диалоговых окон. Здесь хорошей


Создание пользовательских стилей

Из книги автора

Создание пользовательских стилей Несмотря на то что в каждой версии Word количество заготовленных стилей увеличивается, весьма вероятно, что вы не найдете среди них именно то, что нужно вам в данный момент. По этой причине в Microsoft Word предусмотрена также возможность


Создание пользовательских шаблонов

Из книги автора

Создание пользовательских шаблонов Благодаря шаблонам можно сэкономить много времени. Например, если вы постоянно работаете с какой-нибудь организацией и каждый раз вводите стандартное приветствие, реквизиты и т. д., удобно будет создать собственный шаблон на основе


Константы пользовательских классов

Из книги автора

Константы пользовательских классов Символические константы полезны не только при работе с предопределенными типами, такими как INTEGER. Они нужны и тогда, когда их значениями являются объекты классов, созданных разработчиком. В этом случае решение не столь


Глава 2. Создание динамических и интерактивных пользовательских интерфейсов

Из книги автора

Глава 2. Создание динамических и интерактивных пользовательских интерфейсов 2.0. Введение Когда iPhone только появился на рынке, он поистине задал стандарт интерактивности в мобильных приложениях. Приложения iOS были и остаются поразительно интерактивными — вы можете на


2. Модификация и создание пользовательских классов

Из книги автора

2. Модификация и создание пользовательских классов Ruby является объектно-ориентированным языком программирования. Давайте рассмотрим особенности представления классов.Объекты и классыВ реальной жизни все объекты обладают индивидуальными свойствами. Но, введя


Глава 5. Создание пользовательских виджетов

Из книги автора

Глава 5. Создание пользовательских виджетов В данной главе объясняются способы создания пользовательских виджетов с помощью средств разработки Qt. Пользовательские виджеты могут создаваться путем определения подкласса существующего виджета Qt или путем определения