Интернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория»
Шрифт:
Интервал:
Доведем этот образец до реально работающего кода, где угроза исключения зависит от значения генерируемого случайного числа, а обработчик исключения может изменять границы интервала, повышая вероятность успеха.
Определим первым делом собственный класс исключений:
public class MyException: Exception
{
public MyException()
{ }
public MyException (string message): base(message)
{ }
public MyException (string message, Exception e): base(message, e)
{ }
}
Минимум того, что нужно сделать, определяя свои исключения, — это задать три конструктора класса, вызывающие соответствующие конструкторы базового класса Exception.
В классе Excepts, методом которого является наш образец Pattern, определим следующие поля класса:
Random rnd = new Random();
int level = -10;
bool Success; //true — нормальное завершение
int count =1; // число попыток выполнения
const int maxcount =3;
Определим теперь методы, вызываемые в теле охраняемого блока:
void MakeJob()
{
Console.WriteLine("Подготовительные работы завершены");
}
bool CheckDanger()
{
//проверка качества и возможности продолжения работ
int low = rnd.Next(level,10);
if (low > 6) return (false);
return(true);
}
void MakeLastJob()
{
Console.WriteLine("Все работы завершены успешно");
}
В классе Testing зададим метод, вызывающий метод Pattern;
public void TestPattern ()
{
Excepts ex1 = new Excepts ();
try
{
ex1.Pattern ();
}
catch (Exception e)
{
Console.WriteLine("исключительная ситуация при вызове Pattern");
Console.WriteLine(e.ToString ());
}
}
Обратите внимание, что вызов метода Pattern находится внутри охраняемого блока. Поэтому, когда Pattern не справится с обработкой исключительной ситуации, ее обработку возьмет на себя универсальный обработчик, стоящий за try-блоком. На рис. 23.6 показаны три варианта запуска метода TestPattern. в одном из них исключительной ситуации при вызове метода Pattern вообще не возникало, в другом — ситуация возникала, но коррекция обработчика исключения помогла и при повторе выполнения охраняемого блока в Pattern все прошло нормально. В третьем варианте метод Pattern не смог справиться с исключительной ситуацией, и она обрабатывалась в catch-блоке метода TestPattern.
Рис. 23.6. Обработка исключительных ситуаций. Три случая
Класс Exception
Рассмотрим устройство базового класса Exception, чтобы понять, какую информацию может получить обработчик исключения, когда ему передается объект, задающий текущее исключение. Основными свойствами класса являются:
• Message — строка, задающая причину возникновения исключения. Значение этого свойства устанавливается при вызове конструктора класса, когда создается объект, задающий исключение;
• HeipLink — ссылка (URL) на файл, содержащий подробную справку о возможной причине возникновения исключительной ситуации и способах ее устранения;
• InnerException — ссылка на внутреннее исключение. Когда обработчик выбрасывает новое исключение для передачи обработки на следующий уровень, то текущее исключение становится внутренним для вновь создаваемого исключения;
• Source — имя приложения, ставшего причиной исключения;
• StackTrace — цепочка вызовов — методы, хранящиеся в стеке вызовов в момент возникновения исключения;
• Targetsite — метод, выбросивший исключение.
Из методов класса отметим метод GetBaseException. При подъеме по цепочке вызовов он позволяет получить исходное исключение — первопричину возникновения последовательности выбрасываемых исключений.
Класс имеет четыре конструктора, из которых три уже упоминались. Один из них — конструктор без аргументов, второй — принимает строку, становящуюся свойством Message, третий — имеет еще один аргумент: исключение, передаваемое свойству InnerException.
В предыдущий пример я внес некоторые изменения. В частности, добавил еще один аргумент при вызове конструктора исключения в catch-блоке метода Pattern;
throw(new MyException("Все попытки Pattern безуспешны", me));
В этом случае у создаваемого исключения заполняется свойство InnerExceptions. Для слежения за свойствами исключений я добавил метод печати всех свойств, вызываемый во всех обработчиках исключений:
static public void PrintProperties (Exception e)
{
Console.WriteLine("Свойства исключения: ");
Console.WriteLine("Targetsite = {0}", e.Targetsite);
Console.WriteLine("Source = {0}", e.Source);
Console.WriteLine("Message = {0}",e.Message);
if (e.InnerException == null)
Console.WriteLine("InnerException = null");
else Console.WriteLine("InnerException = {0}",
e. InnerException.Message);
Console.WriteLine("StackTrace = {0}", e.StackTrace);
Console.WriteLine("GetBaseException = {0}",
e. GetBaseException ());
}
Из-за громоздкости не привожу результаты, но отмечу, что они соответствуют описанию, приведенному в тексте лекции.
В заключение темы исключений хочу еще раз подчеркнуть, что корректное применение механизма исключений должно поддерживаться целенаправленными усилиями программиста. Следует помнить о двух важных правилах:
• обработка исключений должна быть направлена не столько на уведомление о возникновении ошибки, сколько на корректировку возникшей ситуации;
• если исправить ситуацию не удается, то программа должна быть прервана так, чтобы не были получены некорректные результаты, не удовлетворяющие спецификациям программы.
24. Организация интерфейса и рисование в формах
Организация интерфейса. Шаблоны форм. Заселение формы элементами управления. Классы элементов управления. Примеры классов. Класс ListBox. Наследование форм. Организация меню, главное меню. Инструментальные панели с кнопками. Рисование в формах. Классы рисования. Кисти и перья.
Организация интерфейса
Практически все проекты, построенные в наших лекциях, были консольными приложениями. В реальной жизни консольные проекты — это большая редкость. Причина, по которой из 12 возможных типов проектов мы выбирали наименее используемый, понятна. Нашей целью являлось изучение свойств языка, классов библиотеки FCL, для этих целей консольный проект вполне подходит, позволяя избегать введения не относящихся к сути дела деталей. Теперь цель достигнута — основные средства языка C# рассмотрены, учебный курс завершается. Остались важные темы, требующие более подробного рассмотрения, такие, как, например, работа с атрибутами, создание собственных атрибутов, класс Reflection, работа с файлами и базами данных; но все это предмет будущего курса. Тем не менее, нельзя окончить этот курс, не посвятив две последние лекции Windows-приложениям. Мне бы хотелось, чтобы активные слушатели (читатели) все консольные проекты переделали в Windows-проекты, построив подходящий для них интерфейс.
Первое знакомство с Windows-проектами состоялось в лекции 2, я настоятельно рекомендую перечитать ее, прежде чем продолжить чтение данной лекции. Вкратце напомню, как создается и выполняется Windows-проект. По умолчанию он содержит класс Form1 — наследника класса Form. Этот класс содержит точку входа в проект — процедуру Main, вызывающую статический метод Run класса Application, который создает объект класса Form1 и открывает форму — видимый образ объекта
Поделиться книгой в соц сетях:
Обратите внимание, что комментарий должен быть не короче 20 символов. Покажите уважение к себе и другим пользователям!