![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Логгирование исключений с последующим их перевозбуждением.
>|< © (2010-11-26 16:33:00)Прошу мастеров просмотреть данный код на предмет подводных камней.
Будет ли он правильно работать и какие могут быть нюансы.
procedure TDMMain.KMSExceptionHandler(Sender: TObject; E: Exception);
var fn:string;
LOB: TLOBLocator;
MyBlobStream: TMemoryStream;
ComponentName:string;
begin
try
try
Fn := ExtractFilename(Application.ExeName)+'_'+
Screen.ActiveForm.Name+
FormatDateTime('_ddmmyyyy_hhnnss',now)+
'_debug';
MyBlobStream:= TMemoryStream.Create;
DoGenerateScreenshot;
LOB:= TLOBLocator.CreateTemporary(DMMain.OracleSession, otBLOB, True);
try
oqInsertError.ClearVariables;
oqInsertError.SetVariable('V_FORM_NAME',Screen.ActiveForm.Name+':'+Screen.ActiveForm.Caption);
oqInsertError.SetVariable('V_ERROR_TEXT',E.Message);
oqInsertError.SetVariable('V_ID_USER',DMMain.UserID);
oqInsertError.SetVariable('V_DATETIME',Now);
oqInsertError.SetVariable('V_OSUSER_NAME',CollectUserName);
oqInsertError.SetVariable('V_COMP_NAME',CollectComputerName);
oqInsertError.SetVariable('v_exception_name', E.ClassName);
if Sender is TComponent then
ComponentName := TComponent(Sender).Name
//TODO: Попытаться вытянуть из сендера текстовое заглавие компонента, который возбудил ошибку
else
ComponentName := '<имя неизвестно>';
oqInsertError.SetVariable('v_object_name',Sender.ClassName+':'+ ComponentName);
MyBlobStream.Position := 0;
LOB.CopyFrom(MyBlobStream, MyBlobStream.Size);
oqInsertError.SetComplexVariable('V_SCREENSHOT', LOB);
oqInsertError.Execute;
DMMain.OracleSession.Commit;
finally
LOB.Free;
MyBlobStream.Free;
end;
except
on E_local:Exception do
begin
raise E_local.Create('Ошибка логгирования:'#10#13+ E_local.Message);
MyBlobStream.SaveToFile(fn+'.jpg');
end;
end;
finally
Application.OnException := nil;
raise E.Create('Произошло исключение, которое было записано в БД.');
Application.OnException := KMSExceptionHandler;
end;
end;
Anatoly Podgoretsky (2010-11-30 09:08:00) [1]
> Я то понял, но не только же Делфи на свете.
Я поганой метлой вымету всех отсюда, кто не с Дельфи.
Германн (2010-11-30 02:37:00) [2]
> Я то понял, но не только же Делфи на свете.
Да? Ну и кто же ещё существует на свете? :)
А уж на ДМ просто неприлично упоминать что-то, что не Дельфи. :)
Inovet (2010-11-30 02:18:00) [3]> [50] Германн © (30.11.10 01:41)
> LineBreak - это константа в Дельфи (если ты еще этого не
> понял :)
Я то понял, но не только же Делфи на свете.
Германн (2010-11-30 01:41:00) [4]
> Кстати, у меня как запомнилось когда-то на слух "carriage
> return linefeed", так и осталось, а коды, как коснётся приходится
> вспоминать какой из них какой
Так тебе АП уже несколько раз сказал "используй LineBreak"!
LineBreak - это константа в Дельфи (если ты еще этого не понял :)
Inovet (2010-11-30 01:11:00) [5]> [46] Inovet © (30.11.10 00:41)
> > [38] Anatoly Podgoretsky © (29.11.10 13:52)
> > А #13#10 это стандартный разделитель ДОС/Виндоус
>
> 0D 0A в конце строк.
Ты же это самое и написал.
Кстати, у меня как запомнилось когда-то на слух "carriage return linefeed", так и осталось, а коды, как коснётся приходится вспоминать какой из них какой, раньше помнил, но всё равно заменял символьным сочетанием.
Inovet (2010-11-30 00:55:00) [6]> [47] Anatoly Podgoretsky © (30.11.10 00:43)
> Рекомендую справку взглянуть
Угу, так.
Из MSDN о MessageBox
lpText
[in] Pointer to a null-terminated string that contains the message to be displayed. If the string consists of more than one line, you can separate the lines using a carriage return and/or linefeed character between each line.
Так что нет изварещения
> [46] Inovet © (30.11.10 00:41)
> открыл SysUtils.pas посдледовательность 0D 0A в конце строк.
В смысле открыл Hex вьювере, на концы строк посмотреть.
Anatoly Podgoretsky (2010-11-30 00:43:00) [7]> Inovet (30.11.2010 00:41:46) [46]
LineBreak и путаться не будешь, Дельфи сама будет учитывать ОС
Рекомендую справку взглянуть, если она есть.
Inovet (2010-11-30 00:41:00) [8]> [44] Anatoly Podgoretsky © (30.11.10 00:24)
> вот и Inovet такой же извращенец,
> [45] Anatoly Podgoretsky © (30.11.10 00:25)
> Вообще то правильнее использовать LineBreak
Путаю я эти коды в цифрах, вот такой вобщем и изпользую '\n' - новая строка, а код его таки 0x0a.
> [38] Anatoly Podgoretsky © (29.11.10 13:52)
> А #13#10 это стандартный разделитель ДОС/Виндоус
Блин, открыл SysUtils.pas посдледовательность 0D 0A в конце строк.
Anatoly Podgoretsky (2010-11-30 00:25:00) [9]Вообще то правильнее использовать LineBreak
Anatoly Podgoretsky (2010-11-30 00:24:00) [10]Извращений много разных, вот и Inovet такой же извращенец, наверно его жизнь не била, но все впереди.
Inovet (2010-11-30 00:21:00) [11]> [42] Игорь Шевченко © (29.11.10 23:55)
> только вот мессадж-боксам это по барабану
Странно, всегда пользуюсь разделителями, 0x0a который, в MessageBox, и новая строка получается.
Игорь Шевченко (2010-11-29 23:55:00) [12]
> Вот и весь секрет.
только вот мессадж-боксам это по барабану. Эти разделители имеют смысл в файлах :)
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
Button8: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(#10+#13+'foo'+#10+#13+'bar');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage(#13+#10+'foo'+#13+#10+'bar');
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
ShowMessage(#13+'foo'+#13+'bar');
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
ShowMessage(#10+'foo'+#10+'bar');
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
MessageBox (0, PChar(#10+#13+'foo'+#10+#13+'bar'), 'FOO', MB_OK);
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
MessageBox (0, PChar(#13+#10+'foo'+#13+#10+'bar'), 'FOO', MB_OK);
end;
procedure TForm1.Button7Click(Sender: TObject);
begin
MessageBox (0, PChar(#13+'foo'+#13+'bar'), 'FOO', MB_OK);
end;
procedure TForm1.Button8Click(Sender: TObject);
begin
MessageBox (0, PChar(#10+'foo'+#10+'bar'), 'FOO', MB_OK);
end;
end.
Leonid Troyanovsky (2010-11-29 21:44:00) [13]
> Anatoly Podgoretsky © (29.11.10 19:45) [40]
> Вот и весь секрет.
Перепутывание от перевозбуждения.
--
Regards, LVT.
Anatoly Podgoretsky (2010-11-29 19:45:00) [14]Чего тут делиться, есть три стандартных разделителя, в зависимости от ОС
CR, LF, CRLF
Но хакерам хотелось быть особыми, не похожемы на других, вот они и предумали четвертую комбинацию, которая не признается ни одной ОС - LFCR
Вот и весь секрет.
clickmaker (2010-11-29 14:28:00) [15]> Он правильный (#10#13), но только хакерский
дядя Толя, поделился бы своим опытом бывшего хакера. )
почему именно "хакерский" я до сих пор не понимаю
Anatoly Podgoretsky (2010-11-29 13:52:00) [16]> Ega23 (29.11.2010 12:28:37) [37]
Он правильный (#10#13), но только хакерский
А #13#10 это стандартный разделитель ДОС/Виндоус
Ega23 (2010-11-29 12:28:00) [17]
> Ну наверно автор решил разместить их по возрастанию и это
> он сделал зря.
Я просто такой код настолько часто вижу, что уже начинаю сомневаться, что #13#10 - правильный вариант.
Anatoly Podgoretsky (2010-11-29 12:26:00) [18]> Ega23 (29.11.2010 12:18:35) [35]
Ну наверно автор решил разместить их по возрастанию и это он сделал зря.
Ega23 (2010-11-29 12:18:00) [19]
> По этому поводу буду выводить следующее сообщение:
> ErrorDlg('Возникла ошибка:'+#10#13+E.Message+
Не вдаваясь в подробности всей ветки и разбирание самого вопроса, хочу спросить: а почему #10#13?
$0D - конец строки
$0A - возврат каретки
Или я не прав?
Дмитрий Белькевич (2010-11-29 11:03:00) [20]
> Идея состояла только в том, чтобы вклиниться в очередь возникновения
> ошибок и перед ее возникновением отправить скриншот(другие
> данные) в БД, чтобы можно было проанализировать причину.
>
Можно посмотреть в сторону эврикалог еще. Сильно помогает, делает то, что написал и еще много всяких вкусностей, типа снятия стёка процедур.