![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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-блоки и их тела ..
> решил написать не кий обработчик и повесить его на сабж
показывай его тело ..