Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1139464947
AlexandrK
2006-02-09 09:02
2006.02.26
CGI-приложение. Авторизация


6-1132520333
Balex
2005-11-20 23:58
2006.02.26
Как программно открыть Word овский документ Word ом


8-1126982161
ArtemESC
2005-09-17 22:36
2006.02.26
Как реализовать освящение


1-1138192840
alles
2006-01-25 15:40
2006.02.26
Вызов функций из DLL (с++)


2-1139346163
serko
2006-02-08 00:02
2006.02.26
Image





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский