Чтение онлайн

на главную

Жанры

Интернет-журнал "Домашняя лаборатория", 2007 №9
Шрифт:

FileMode.Create, FileAccess.Write);

TextWriterTraceListener writer1 =

new TextWriterTraceListener(f);

TextWriterTraceListener writer2 =

new TextWriterTraceListener(System.Console.Out);

Trace.Listeners.Add(writer1);

Debug.Listeners.Add (writer2);

Debug.WriteLine("Число слушателей: " +

Debug.Listeners.Count);

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

Trace.AutoFiush);

Trace. WriteLinelf (x<0, "Trace: " + "x= " + x.ToString

+ " у = " + y);

Debug. WriteLine (" Debug: " + "x= " + x.ToString +

" у = " + у);

Trace.Flush;

f. Close;

}

В

коллекцию слушателей вывода к слушателю по умолчанию добавляются еще два слушателя класса TextWriterTraceListener. Заметьте, что хотя они добавляются методами разных классов Debug и Trace, попадают они в одну коллекцию. Как и обещано, один из этих слушателей направляет вывод в файл, другой на консоль. На рис. 23.2 на фоне окна кода показаны три канала вывода — окно Output, консоль, файл — содержащие одну и ту же информацию.

Рис. 23.2. Три канала вывода

Метод Флойда и утверждения Assert

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

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

Схема Флойда используется на практике, по крайней мере, программистами, имеющими вкус к строгим методам доказательства. Утверждения становятся частью программного текста. Само доказательство может и не проводиться: чаще всего у программиста есть уверенность в справедливости расставленных утверждений и убежденность, что при желании он мог бы провести и строгое доказательство. В C# эта схема поддерживается тем, что классы Debug и Trace имеют метод Assert, аргументом которого является утверждение. Что происходит, когда вычисление достигает соответствующей точки и вызывается метод Assert? Если истинно булево выражение в Assert, то вычисления продолжаются, не оказывая никакого влияния на нормальный ход вычислений. Если оно ложно, то корректность вычислений под сомнением, их выполнение приостанавливается

и появляется окно с уведомлением о произошедшем событии, что показано на рис. 23.3.

Рис. 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. Мощь этого механизма в том, что константы можно менять в файле конфигурации проекта, не изменяя код проекта и не требуя его перекомпиляции.

Поделиться:
Популярные книги

Темный Патриарх Светлого Рода

Лисицин Евгений
1. Темный Патриарх Светлого Рода
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода

Под маской моего мужа

Рам Янка
Любовные романы:
современные любовные романы
5.67
рейтинг книги
Под маской моего мужа

Держать удар

Иванов Дмитрий
11. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Держать удар

Любовь Носорога

Зайцева Мария
Любовные романы:
современные любовные романы
9.11
рейтинг книги
Любовь Носорога

Кодекс Охотника. Книга XXIII

Винокуров Юрий
23. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXIII

Меняя маски

Метельский Николай Александрович
1. Унесенный ветром
Фантастика:
боевая фантастика
попаданцы
9.22
рейтинг книги
Меняя маски

Ученик. Второй пояс

Игнатов Михаил Павлович
9. Путь
Фантастика:
фэнтези
боевая фантастика
5.67
рейтинг книги
Ученик. Второй пояс

Зеркало силы

Кас Маркус
3. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Зеркало силы

Повелитель механического легиона. Том V

Лисицин Евгений
5. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том V

Барон устанавливает правила

Ренгач Евгений
6. Закон сильного
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Барон устанавливает правила

Мастер темных Арканов

Карелин Сергей Витальевич
1. Мастер темных арканов
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Мастер темных Арканов

Архил...?

Кожевников Павел
1. Архил...?
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Архил...?

Мимик нового Мира 3

Северный Лис
2. Мимик!
Фантастика:
юмористическая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 3

Идеальный мир для Социопата 3

Сапфир Олег
3. Социопат
Фантастика:
боевая фантастика
6.17
рейтинг книги
Идеальный мир для Социопата 3