Форум: "Основная";
Текущий архив: 2003.09.15;
Скачать: [xml.tar.bz2];
ВнизНету ли директивы компилятора, которая показывает строку в коде Найти похожие ветки
← →
Song (2003-08-30 18:06) [0]где эта директива стоит?
Давно хотел узнать.
← →
Song (2003-08-30 18:07) [1]В смысле её номер.
← →
Юрий Зотов (2003-08-30 18:41) [2]Директивы нет, но можно использовать Assert с отловом Exception (можно и глобальным). В сообщении есть номер строки, парсится элементарно.
← →
Song (2003-08-30 18:50) [3]Хотелось бы чего-нибудь такого:
MessageDlg("... Ошибка. Код ошибки: "+SysErrorMessage(GetLastError+". CurrentUnit x "+{$LineNumber}+". Обратитесь к разработчику.",mtError,[mbOk],0);
А как через Assert.. даже пока не представляю, сейчас гляну.
← →
Юрий Зотов (2003-08-30 19:10) [4]В нужных местах просто вызываете Assert, а в OnExeption получаете сообщение с номером строки вызова.
← →
Anatoly Podgoretsky (2003-08-30 19:19) [5]Кроме Assert вроде ничего нет
← →
vuk (2003-08-30 19:20) [6]По большому счету, если нужно знать, где ошибка произошла, то можно попробовать использовать трассировку стека исключений из JVCL. Правда там понадобится либо отладочная информация либо .map файл.
← →
Avsam (2003-08-31 00:33) [7]{$LineNumber} - что это?
← →
Anatoly Podgoretsky (2003-08-31 00:52) [8]Avsam © (31.08.03 00:33) [7]
Это где?
← →
Alex Konshin (2003-08-31 03:13) [9]В JCL есть, там целый раздел посвящен использованию отладочной информации.
Смотри http://sourceforge.net/projects/jcl/
← →
Song (2003-08-31 09:54) [10]2[7] Avsam © (31.08.03 00:33)
> {$LineNumber} - что это?
Я ж написал: "хотелось бы"
← →
Song (2003-09-03 13:16) [11]Сделал через Assert, строчку в тексте выцепляю,но повилась проблема.
Var ErrorLineNumber: String; // глобальная
procedure TMain.FormCreate(Sender: TObject);
begin
With Application Do
Begin
onMessage:=OnMessageProc;
onException:=onExceptionProc;
End; {With}
end;
procedure TMain.onExceptionProc(Sender: TObject; E: Exception);
Var S: String;
begin
IF Pos("line",E.Message)>0 then
Begin
S:=E.Message;
S:=Copy(S,Pos("line",S)+5,Length(S));
ErrorLineNumber:=Copy(S,1,Length(S)-1);
Application.HandleException(Sender);
End else
{ ????? ?????? ????????? ?? ?????? }
Begin
NewSp5Form.MakeSound(300,300);
MessageDlg("?????????? ???????????? ??????. ??? ??????: "+E.Message+"."#13#10+
"??? ?????????? ???????? ???????? ? ?????????? ?????????? ? ????????????, ?????? ??????? ? ???????? ????????????? ??????.",mtError,[mbOk],0);
End; {else}
end;
Из другого модуля
try
...
// Здесь что-то, что может привести к исключению
except
{ Достаём номер строчки }
Assert(False);
MessageDlg("Ошибка. Код ошибки: "+SysErrorMessage(GetLastError)+". Модуль XXX x "+ErrorLineNumber,mtError,[mbOk],0);
end;
Вроде всё должно работать, т.е. перед выводом сообщения о ошибке получаем номер строки, для этого вызываем Assert, а потом передаём этот номер в MessageDlg(). Но вызов Assert даёт исключение EAssertException, что прерывает ход программы и MessageDlg() не запускается. Как лечить?
← →
Song (2003-09-03 13:17) [12]Вот этой строчки быть не должно: Application.HandleException(Sender)
← →
Song (2003-09-03 15:14) [13]Всем спасибо, кто заинтересовался.
Вопрос решил, правда грубовато, но решил.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.09.15;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c