Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Application.OnException [D7, Win2k]


NiGGa ©   (2005-12-08 16:37:00) 

Здраствуйте.
Собственно решил написать не кий обработчик и повесить его на сабж. Сгенерил АВ, и в результате вместо ожидаемой обработки получмл крайне странные результаты. Тогда я заккоментировал весь код обработки исключения, и вот что меня удивило: что после генерации АВ начинается отработка кода обработчика(который пустой), и как только она заканчивается, снова! начинается отработка кода обработчика. очевидно оно так может до бесконечности.
Мне нужно собственно объяснение этого феномена, ведь так быть не должно.


NiGGa   (2005-12-08 17:32:00) [1]

Прошу прощения, немного соврал. По сути это не важно но все же.

function TExceptionHandler.GenerateExeptionInformation(const E: Exception): TStringList;
var
 eInformation: TStringList;
 fileName: string;
begin
 eInformation := TStringList.Create;
 eInformation.Add('Èìÿ êîìïüþòåðà: [' + ComputerName + ']');
 eInformation.Add('Èìÿ ïîëüçîâàòåëÿ: [' + UserName + ']');
 eInformation.Add('Îøèáêà: [' + E.Message + ']');
 eInformation.Add('Àêòèâíàÿ ôîðìà: [' + Screen.ActiveForm.Name + ']');
 if FFileVersionInfo.InformationExist then begin
   eInformation.Add('');
   eInformation.Add('Èíôîðìàöèÿ î ïðîãðàììå:');
   eInformation.Add('  Èìÿ êîìïàíèè: ' + FFileVersionInfo.CompanyName);
   eInformation.Add('  Íàçâàíèå ïðîäóêòà: ' + FFileVersionInfo.ProductName);
   eInformation.Add('  Âåðñèÿ ïðîäóêòà: ' + FFileVersionInfo.ProductVersion);
   eInformation.Add('  Âåðñèÿ ôàéëà: ' + FFileVersionInfo.FileVersion);
   eInformation.Add('  Îïèñàíèå ôàéëà: ' + FFileVersionInfo.FileDescription);
   eInformation.Add('  Àâòîðñêîå ïðàâî: ' + FFileVersionInfo.LegalCopyright);
   eInformation.Add('  Âíóòðåííåå èìÿ: ' + FFileVersionInfo.InternalName);
   eInformation.Add('  Èìÿ ôàéëà: ' + FFileVersionInfo.OriginalFilename);
   eInformation.Add('  Êîììåíòàðèè: ' + FFileVersionInfo.Comments);
   eInformation.Add('  ßçûê: ' + FFileVersionInfo.LanguageInfo);
 end; {if}

 Result := eInformation;

 fileName := ExtractFilePath(Application.ExeName) + CErrorFolder + '\' + FFileName + '.rpt';
 CheckErrorFolderExistence;
 eInformation.SaveToFile(fileName);
end; {GenerateExeptionInformation}


FFileVersionInfo - тут и берется GetFileVersionInfo.


NiGGA   (2005-12-08 17:29:00) [2]

ОК.

генерю сам ексепшн:
procedure TForm1.Button1Click(Sender: TObject);
var
 p: ^integer;
begin
 p^ := 100;
end;


Обработчик
procedure TExceptionHandler.ExceptionHandler(Sender: TObject; E: Exception);
var
 Msg: string;
 jpgAFFile, jpgDFile: string;
 eInformation: TStringList;
begin
 if FShowException then Application.ShowException(E);

 FFileName := ExtractFileName(Application.ExeName) + '_' +
              FormatDateTime('yymmdd_hhnnss', Now);

 //jpgAFFile := ApplicationScreenshot;
 //jpgDFile := DesktopScreenshot;

 eInformation := GenerateExeptionInformation(E);

 if FShowErrorMessage then begin
   Msg := E.Message;

   if MessageBox(Application.Handle,
                 PChar(Msg + #13#13+
                 'Íåâîçìîæíî êîððåêòíî îáðàáîòàòü îøèáêó.' + #13 +
                 'Ýòî ìîæåò ïðèâåñòè ê íåïðàâèëüíîé ðàáîòå ñèñòåìû è âîçìîæíî ïîòåðå äàííûõ.      ' + #13#13 +
                 'Ñãåíåðèðîâàòü ïèñüìî ñ îïèñàíèåì îøèáêè â ñëóæáó ïîääåðæêè?'  + #0),
                 PChar(Application.Title + '. Íåîáðàáîòàííàÿ îøèáêà.' + #0),
                 MB_YESNO + MB_ICONERROR) = IDYES
   then SendEmail(SupportMail, SupportMail, 'Î÷åò îá îøèáêå. Ïðîãðàììà [' + Application.Title + ']', jpgAFFile + ';' + jpgDFile, eInformation);
 end;

 eInformation.Clear;
 eInformation.Free;

 E := EAbort.Create('gi');
 
 if FTerminateOnException then Application.Terminate;        
end;


ApplicationScreenshot, DesktopScreenshot - скриншоты активного окна и десктопа

GenerateExeptionInformation(E) - генерит TStrings с содержанием Е.Message и GetFileVersionInfo.

SendEmail - шлет мыло посредством MAPI.

Но сама соль в том, что когда закомментировал все строки, оставив только begin end; получил при первом же нажатии на кнопку, по кругу выполняющийся код(путой) обработчика.


Digitman   (2005-12-08 16:45:00) [3]


> Сгенерил АВ


показыва в коде, где и как ..

показывай так же потенциально фигурирующие в том месте try..except-блоки и их тела ..


> решил написать не кий обработчик и повесить его на сабж


показывай его тело ..


Наверх

Титульная страница Поиск, карта сайта Написать письмо