Форум: "Основная";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
ВнизНа какой форме произошло исключение Найти похожие ветки
← →
Квэнди © (2006-01-24 17:56) [0]Здравствуйте.
Я в своей программе обрабатываю исключения, возникшие во время выполнения и кидаю их описание в некий файл, вот у меня вопрос, можно ли как- нибудь узнать на какой именно форме, т.е. в каком модуле произошло это исключение ?
← →
Сайбель Алексей © (2006-01-24 18:00) [1]Можно каждому критическому участку кода, которые ты обрабатываешь присваивать свой GUID.
По мере выполнения исключений, легко находятся те участки в которых они произошли.
← →
Квэнди © (2006-01-24 18:21) [2]Я это твариант рассматривал, но мне это показалось несколько некорреткным... но если другого способа нет, то придется делать так...
← →
Сайбель Алексей © (2006-01-24 18:32) [3]Не вижу ничего некорректного
try
...
finally
...
write(f,"{7C9F5EA6-2978-4EC5-8F1A-7B9E32B58222}"
);
end;
← →
Leonid Troyanovsky © (2006-01-24 18:49) [4]
> Квэнди © (24.01.06 17:56)
> Я в своей программе обрабатываю исключения, возникшие во
> время выполнения и кидаю их описание в некий файл, вот у
> меня вопрос, можно ли как- нибудь узнать на какой именно
> форме, т.е. в каком модуле произошло это исключение ?
Можно поступить следующим образом.
Заводим глобальную переменную prefix: String, которую будем
использовать при формировании текста исключений путем
raise Exception.Create(prefix + MyErrorString).
Инициализировать ее можно в разделе initialization:
initialization
try
Assert(False, "");
except
on E: EAssertionFailed do
prefix := E.Message;
end;
Ну, и, обычно в финальных релизах эти фишки отключаются.
--
Regards, LVT.
← →
Квэнди © (2006-01-24 19:39) [5]благодарю. именно так и сделаю
← →
буратино (2006-01-24 19:44) [6]Leonid Troyanovsky © (24.01.06 18:49) [4]
не до конца понял принцип работы сей конструкции. можете пояснить?
← →
Сайбель Алексей © (2006-01-24 20:35) [7][3] except конечно
2 Leonid Troyanovsky © [4]
Интересно, не знал
2 буратино [6]
http://warayg.narod.ru/context/prog/Delphi/3/Glava3/Index10.html
← →
Квэнди © (2006-01-25 08:45) [8]У меня еще вопрос:
у меня организовано глобальная обработка исключений, т.е.
application.onexception:= proc;
все работает, но при использовании конструкции try...except срабатывает код, который в except, что логично, но мне бы хотелось, чтобы срабатывала так же и процедура proc.. как это можно реализовать ? или только
try
...
except
.....
proc(sender,E);
end;
так ? можно ли по другому ?
← →
Квэнди © (2006-01-25 08:47) [9]Точнее поправлюсь, разумеется
try
....
except
on e:exception do
......
proc(sender,E);
end;
← →
Leonid Troyanovsky © (2006-01-25 08:56) [10]
> Квэнди © (25.01.06 08:47) [9]
> Точнее поправлюсь, разумеется
> try
> ....
> except
> on e:exception do
> ......
> proc(sender,E);
> end;
Обычно в таких случаях после proc(..) идет raise, который повторно
возбуждает исключение для обработчика следующего уровня (re-raising).
Кстати, обработчику proc не обязательно обрабатывать все исключения,
ему можно поручить лишь известные ему, т.е.
on E: EMyException do
begin
proc(.., E);
raise;
end;
--
Regards, LVT.
← →
Квэнди © (2006-01-25 08:58) [11]Благодарю, так и сделаю.
← →
Квэнди © (2006-01-25 09:01) [12]Да, кстати, а может в этом случае нет смысла вызывать proc, а просто возбудить исключение raise-ом ?
← →
Leonid Troyanovsky © (2006-01-25 09:18) [13]
> Квэнди © (25.01.06 09:01) [12]
> Да, кстати, а может в этом случае нет смысла вызывать proc,
> а просто возбудить исключение raise-ом ?
Если proc - глобальный обработчик, и если не требуется специфическая
обработка исключения, то исключение лучше просто пропустить.
Обычно подобная конструкция используется для многоуровневой
обработки.on E: EMyException do
begin
proc1(E); // локальная обработка исключения
raise; // вызов исключения для обработчика следующего уровня
end;
Ну, и, понятно, что исключения классов, отличных от EMyEception,
этим try-except не обрабатываются и попадают прямо в обработчик
следующего уровня.
--
Regards, LVT.
← →
Квэнди © (2006-01-25 09:38) [14]Благодарю за подробное объяснение!
← →
Alex Konshin © (2006-01-25 11:14) [15]Все это бирюльки. Посмотрите Debuging в Jedi. Он дает возможность получить стек вызовов. После Java с ее встроенными средствами выдачи стека при exception в Delphi остро ощущаешь их нехватку.
http://sourceforge.net/projects/jcl
← →
Квэнди © (2006-01-25 12:15) [16]Вот код:
procedure tfproc.chexcept(sender:tobject;E:exception);
var userw,dir,str:string;
ts:pchar;
time:tdatetime;
begin
try
userw:=getuser;
ts:=StrAlloc(255);
getwindowsdirectory(ts,255);
dir:=ts;
time:=now;
str:=datetimetostr(time)+" "+user+" "+userw+" "+E.Message+" "+e.ClassName+" "+strex;
mail.Connect();
if mail.Connected then
mail.QuickSend("10.1.1.220","Linkterm-Exception","pavel@helios-net.ru","linkterm@mail.ru",str);
mail.Disconnect;
except
end;
end;
это обработчик исключений...procedure Tfstart.FormCreate(Sender: TObject);
begin
application.OnException:=fproc.chexcept;
end;
вот код, который надо обработать:.....
try
if (tg1.Text<>"")and(tm1.Text<>"") then
begin
fres:=strtoint(tg1.Text)+(strtoint(tm1.Text)/60);
sres:=floattostr(roundto(fres,-2));
sres:=stringreplace(sres,",",".",[rfreplaceall]);
tg3.Text:=sres;
if length(tm1.Text)>1 then
tg2.SetFocus;
end;
except
showmessage("Введено неверное значение");
raise;
end;
безусловно можно указать конкретное исключение, но возникает оно здесь одно, при эмуляции ошибки ,showmessage("Введено неверное значение");
срабатывает, но появляется потом ошибка кода обработки исключений, не подскажите почему ?
← →
Leonid Troyanovsky © (2006-01-25 12:46) [17]
> Квэнди © (25.01.06 12:15) [16]
> Вот код:
> except
> end;
Так не надо делать _никогда_
Если оный обработчик не знает, что делать с исключением,
то он просто обязан его пропустить. Т.е., лучше никакого
обработчика, чем подобный.
> безусловно можно указать конкретное исключение, но возникает
> оно здесь одно
Ну, а в более общих случаях может и не одно.
Но, правило все тоже: если обработчик не знает, что делать
с исключением, он обязан его пропустить.
В данном случае, видимо, обработчик знает про EConvertError.
Показать же исключение может и обработчик по умолчанию
(при включенном SysUtils).
> срабатывает, но появляется потом ошибка кода обработки исключений,
> не подскажите почему ?
В смысле, что Tools-Debugger Options-Language Exception установлен
Stop on Delphi Exceptions?
--
Regards, LVT.
← →
Квэнди © (2006-01-25 13:50) [18]Ваши рекомендации учел.
Уточню: при трасировке выполнения на кодеtry
if (tg1.Text<>"")and(tm1.Text<>"") then
begin
fres:=strtoint(tg1.Text)+(strtoint(tm1.Text)/60);
sres:=floattostr(roundto(fres,-2));
sres:=stringreplace(sres,",",".",[rfreplaceall]);
tg3.Text:=sres;
if length(tm1.Text)>1 then
tg2.SetFocus;
end;
except
showmessage("Введено неверное значение");
raise;
end;
послеshowmessage("Введено неверное значение");
срабатывает ошибка Access violation, и соответственно кодstr:=datetimetostr(time)+" "+user+" "+userw+" "+E.Message+" "+e.ClassName+" "+strex;
mail.Connect();
if mail.Connected then
mail.QuickSend("10.1.1.220","Linkterm-Exception","pavel@helios-net.ru","linkterm@mail.ru",str);
mail.Disconnect;
а пустойtry
....
except
end;
Использовал с целью, что если исключение произойдет в кодеprocedure tfproc.chexcept(sender:tobject;E:exception);
не получить "зацикливания" выполнения.
← →
Leonid Troyanovsky © (2006-01-25 14:18) [19]
> Квэнди © (25.01.06 13:50) [18]
> if (tg1.Text<>"")and(tm1.Text<>"") then
> begin
> fres:=strtoint(tg1.Text)+(strtoint(tm1.Text)/60);
> sres:=floattostr(roundto(fres,-2));
> sres:=stringreplace(sres,",",".",[rfreplaceall]);
> tg3.Text:=sres;
> if length(tm1.Text)>1 then
> tg2.SetFocus;
На первый взгляд в показанном нет ничего преступного, за исключением,
пожалуй, возможного несуществования объектов tg*, tm*.
Т.е., возможно, что проявление AV на ShowMessage - это наведенная
ошибка, произошедшая раньше (обычно при неаккуратном вызове
API функций, требующих буфера для результата).
Кстати, ранее приведенный код для getwindowsdirectory не совсем
аккуратен, бо не освобождается выделенное для ts.
Проще всего объявить ts : array [0..MAX_PATH] of Char и
Win32Check(GetWindowsDirectory(ts, SizeOf(ts)) <> 0);
> не получить "зацикливания" выполнения.
Его и не будет, бо при исключениях возникших в глобальном
обработчике оно будет показано, а программа завершена.
--
Regards, LVT.
← →
Квэнди © (2006-01-25 14:58) [20]
> Его и не будет, бо при исключениях возникших в глобальном
> обработчике оно будет показано, а программа завершена.
Не знал, спасибо.
> Кстати, ранее приведенный код для getwindowsdirectory не
> совсем
> аккуратен, бо не освобождается выделенное для ts.
> Проще всего объявить ts : array [0..MAX_PATH] of Char и
>
> Win32Check(GetWindowsDirectory(ts, SizeOf(ts)) <> 0);
Это был не нужный код, я его убрал.
Как было замечено ошибка возникает при обращении к объекту mail:TIdSmtp
, при этом при проверке кода в другой программе выяснилось, что код рабочий, и все выполняется корректно...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.041 c