Выделенный ассерт нужен для того, чтобы чего не забыть, буде появится новый тип, который надо обработать. Но сообщение, которое выкидывает assert, уж очень неинформативное:
Assertion failed: false, file C:\JOB\Garbage\AssertionTest.cpp, line 85
Здравствуйте, Flamer, Вы писали:
F>Сегодня открытие сделал Вернее, приспособил для себя более удобный способ оставлять [сабж], чтобы чего-то не забыть дописать.
F>З.З.Ы. Как там в "Юморе" говорят? Звиняйте, если байан
Я обычно создаю константы на основе GUID с сообщениями и выношу их описание в отдельный модуль. Получается assert с удобоворимым, написанным мной сообщением, которое позволяет понять где и какой произошел облом. Номер строки мало что говорит при наличии у пользователей нескольких версий программы. Восстанавливать каждый раз исходники для нужной версии неудобно и хлопотно.
Что-то вроде.
Assert(Assigned(FPlace), CAssert_927C00FE_D84B_4E15_8CBF_5CCB3514C82D);
...
unit AssertsConsts
...
CAssert_927C00FE_D84B_4E15_8CBF_5CCB3514C82D = '...';
Это я так...вдруг кто-то умней делает, то может подскажут...
F>Выделенный ассерт нужен для того, чтобы чего не забыть, буде появится новый тип, который надо обработать. Но сообщение, которое выкидывает assert, уж очень неинформативное:
F>
F>Assertion failed: false, file C:\JOB\Garbage\AssertionTest.cpp, line 85
F>
Я обычно делаю так
switch(nodeType)
{
case stringNode:
...
break;
default:
assert(!"missed case in " __FUNCTION__);break;
} // switch
PROCEDURE Error(CONST e: SysUtils.Exception; CONST UnitName, ProcName: STRING);
BEGIN
IF ASSIGNED(e) THEN BEGIN
FErrorsForm.ErrorDlg(UnitName, ProcName, e.Message);
TRAP(UnitName + '.' + ProcName+' {' + e.Message + '}');
END;
END;
PROCEDURE Trap(msg: STRING);
BEGIN
RAISE SysUtils.Exception.Create(msg);
END;
которая пишет сообщение об ошибке в журнал ошибок, а потом возбуждает новое исключение с информацией о старом. Таким образом, я всегда знаю не только имя модуля и имя процедуры в которой произошло исключение (естественно вместе с текстом самого исключения), но также знаю весь стек вызовов процедур по которым это исключение прокатилось. Работа по оборачиванию тела каждой процедуры дополнительным блоком TRY EXCEPT с лихвой окупается, ведь я получаю возможность мгновенного определения ошибок, которые в противном случае было бы очень сложно (а главное долго) обнаруживать. Следующим шагом по внедрению дебажного механизма в код программы могло бы быть еще и запись в текст исключения информации о состоянии локальных переменных каждой процедуры по которым раскручивалось исключение, но это слишком напряжно.
P.S. Вот если писать прогу на Обероне под названием Component Pascal в системе BlackBox, то там при возникновении system trap (и наличии исходника) автоматически курсор устанавливается в то место где произошел сбой и показывается диалоговое окно со стеком всех процедур и со значениями локальных переменных всех процедур, то есть там, та работа, которую я в Delphi выполнял вручную, сделана автоматом.
Здравствуйте, S.Yu.Gubanov, Вы писали:
SYG>P.S. Вот если писать прогу на Обероне под названием Component Pascal в системе BlackBox, то там при возникновении system trap (и наличии исходника) автоматически курсор устанавливается в то место где произошел сбой и показывается диалоговое окно со стеком всех процедур и со значениями локальных переменных всех процедур, то есть там, та работа, которую я в Delphi выполнял вручную, сделана автоматом.
З.З.Ы. Вот если писать прогу на Java или .Net, то там при возникновении exception независимо от наличия исходника доступен полный stack trace. А IDE, где возможно, позиционирует курсор на нужную строку.
Впрочем, под отладкой позиционирование курсора выполняет и Delphi.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>З.З.Ы. Вот если писать прогу на Java или .Net, то там при возникновении exception независимо от наличия исходника доступен полный stack trace. А IDE, где возможно, позиционирует курсор на нужную строку. S>Впрочем, под отладкой позиционирование курсора выполняет и Delphi.
А вот если писать прогу на VisualWorks Smalltalk, то там при возникновении Exception открывается дебаггер с полным stack trace, возможностью гулять по нему туда-сюда, сразу же доступен код метода по позиции в stack trace. И тут же можно этот код отредактиовать, а сообщение — перепослать и продолжить работу . Это, конечно, если вы в developer-режиме. В deployment-версии — только stack trace (сжатый и развернутый).