Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 80

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 74 75 76 77 78 79 < 80 > 81 82 83 84 85 86 .. 320 >> Следующая

Обработка исключений 183
присвоить требуемое значение свойства Message системному классу исключения через его конструктор. Как правило, смысл создавать пользовательские исключе ния есть только тогда, когда ошибка тесно связана с пользовательским классом, в котором она возникла (например, класс Fi 1 е может генерировать ошибки, возникающие при работе с файлами).
Создание пользовательских исключений, второй этап
Наш пользовательский класс Car'sOeadExcepti on для выдачи сообщения об ошибю замещает свойство Message. Кроме того, в этом классе также предусмотрен руктор, принимающий имя автомобиля, который стал причиной возникновения исключения. Мы можем создать любой пользовательский класс-исключение, удовлетворяющий нашим потребностям: это право разработчика. Однако в этом случае класс-исключение СагЬОеааЕхсергюппритехжевозможностяхможетвыгля-деть проще:
public class CarlsDeadException : System.Exception
{
II Конструкторы для создания пользовательского сообщения об ошибке public CarIsDeadException(){}
public CarIsDeadException(string message) : base(message){}
public CarlsDeadException (st ring message. Exception innerEx) : basetmessage. іппегЕх){}
}
Обратите внимание, что в этом варианте нам не нужна строковая перемен ная для хранения имени машины и мы не замещаем свойство Message. Все, что нам нужно — это просто передать информацию членам базового класса. Піп генерации исключения мы передаем необходимую информацию как параметр конструктора (результат выполнения программы будет таким же, как и ше):
SpeedUpCint delta) (
Il Если машина вышла из строя - сообщить об этой if (dead)
{
II Передаем имя нашины и сообщение как аргументы конструктора
throw new CarIsDeadException(this.petName + " has bought the farm!");
else // Машина пока жиж ножно разгоняться (
Такое решение нашего пользовательского класса-исключения, конечно, является более удачным — по крайней мере ввиду отсутствия лишних переменных и замещенных членов.
184 Глава 3 • С# и объектно-ориентированное программирование
Обработка нескольких исключений
В наиболее простой форме одному блоку соответствует один блок catch. Однако в реальных проектах часто возникают ситуации, когда нам необходимо отслеживать возникновение не одного, а нескольких исключений. Например, предположим, что наш метод будет генерировать одно исключение, когда мы пытаемся разогнать вышедший из строя автомобиль (эту ситуацию мы уже разбирали), и другое — когда мы передаем этому методу неподходящие параметры (например, любое число меньше нуля).
// Проверка параметров на соответствие условиям
public void SpeedUpdnt delta)
{
// Ошибка в принимаемом параметре? Генерируем системное исключение if (delta < 0)
throw new ArgumentOutOfRangeException("Must be greater than zero");
// Если машина вышла из строя - сообщить об этом if(dead)
{
// Генерируем исключение CarlsDeadException
throw new CarIsOeadException(this.petName + ' has bought the farm!"):
)
}
Код для вызова исключений может выглядеть следующим образом:
// Теперь мы Г0Т03Ы перехватить оба исключения
try
{
for(1nt і = 0; і < 10: і++) buddha.SpeedupС10):
)
catch(CarIsDeadExcept1on е)
{
Consolе.Wr і teL і ne(е. Message): Consolе.Wri teL і пе(е.StackTrace):
}
cdtcti¦'.ArgmnentOfRangeException e) {
Console.WriteLineCe,Message): Console.WrI teLineCe.StackTrace):
}
Блок finally
После блока /catch в С# может следовать необязательный блок Этот
блок выполняется всегда, вне зависимости от того, сработало исключение или нет. Его главное назначение — гарантировать, что ресурсы, которые могут быть открыты потенциально опасным методом, будут обязательно освобождены. Например, представим себе, что наша задача — сделать так, чтобы радио в автомобиле выключалось всегда при выходе из программы (метода MainO), вне зависимости от того, возникли или нет какие-нибудь ошибки в процессе выполнения:
Обработка исключений 185
// Используем блок finally для закрытия всех ресурсов
public static int Main(string[] args)
{
Саг buddha - new Саг{"Buddha¦. 100. 20); buddha. CrankTunes(true);
Il Давим на газ try
{
И Разгоняем машину.. .
)
catchCCarlsDeadException е)
{
Console.WriteLine(e.Message): Console.Wr1tef:ne(e.Stacitfi-3ce):
}
catchtArgumentOutOfRangeException e)
[
Console,Wri teL і ne(e. Mess age): Console.Wri teLіne(e.StackTrace):
}
finally
{
Il Этот блок будет выполнен всегда - вне зависимости от того, // произошла ошибка или нет buddha.CrankTunes(false);
}
return 0;
}
В нашей программе радио в автомобиле будет выключено всегда, вне зави симости от возникновения каких-либо исключений — потому, что мы помести ли соответствующий код в блокґ 1 паї 1у. Конечно,спомощьюблокаґ 1 паї Іумож-но не только «выключать радио» — в реальных проектах этот блок используется для освобождения памяти, закрытия файла, отключения от источника и ,тан ных и выполнения прочих операций, связанных с корректным завершением программы.
Код приложения Exceptions можно найти в подкаталоге Chapter 3.
Последние замечания о работе с исключениями
Предыдущая << 1 .. 74 75 76 77 78 79 < 80 > 81 82 83 84 85 86 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100