Выбрать главу

Рис. 23.3. Нарушение утверждения Assert

В этой ситуации у программиста есть несколько возможностей:

• прервать выполнение, нажав кнопку Abort;

• перейти в режим отладки (Retry);

• продолжить вычисления, проигнорировав уведомление.

В последнем случае сообщение о возникшей ошибке будет послано всем слушателям коллекции TraceListeneгCollection.

Рассмотрим простой пример, демонстрирующий нарушение утверждения:

public void WriteToFile()

{

    Stream myFile = new

       FileStream("TestFile.txt",FileMode.Create,FileAccess.Write);

    TextWriterTraceListener myTextListener =

       new TextWriterTraceListener(myFile); int у = Debug.Listeners.Add(myTextListener);

    TextWriterTraceListener myWriter =

          new TextWriterTraceListener(System.Console.Out);

    Trace.Listeners.Add(myWriter);

    Trace.AutoFlush = true;

    Trace.WriteLine("автоматический вывод из буфера:"

         + Trace.AutoFlush);

     int x = 22;

     Trace.Assert(x<=21, "Перебор");

     myWriter.WriteLine("Вывод только на консоль");

    //Trace.Flush();

    //Вывод только в файл

    byte[] buf = {(byte)'В;(byte)'у'};

    myFile.Write(buf,0, 2);

    myFile.Close ();

}

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

Рис. 23.4. Файл с записью сообщения о нарушении утверждения Assert

Вариацией метода Assert является метод Fail, всегда приводящий к появлению окна с сообщением о нарушении утверждения, проверка которого осуществляется обычным программным путем.

Классы StackTrace и BooleanSwitch

В библиотеке FCL имеются и другие классы, полезные при отладке. Класс StackTrace позволяет получить программный доступ к стеку вызовов. Класс BooieanSwitch предоставляет механизм, аналогичный константам условной компиляции. Он разрешает определять константы, используемые позже в методе условной печати WriteIf классов Debug и Trace. Мощь этого механизма в том, что константы можно менять в файле конфигурации проекта, не изменяя код проекта и не требуя его перекомпиляции.

Отладка и инструментальная среда Visual Studio.Net

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

Обработка исключительных ситуаций

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

Что делать при возникновении исключительной ситуации? Конечно, всегда есть стандартный способ — сообщить о возникшей ошибке и прервать выполнение программы. Понятно, что это приемлемо лишь для безобидных приложений; даже для компьютерных игр этот способ не годится, что уж говорить о критически важных приложениях!

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