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

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

Логгирование исключений с последующим их перевозбуждением.


Страницы:   1 2 3

>|< ©   (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]


> Идея состояла только в том, чтобы вклиниться в очередь возникновения
> ошибок и перед ее возникновением отправить скриншот(другие
> данные) в БД, чтобы можно было проанализировать причину.
>


Можно посмотреть в сторону эврикалог еще. Сильно помогает, делает то, что написал и еще много всяких вкусностей, типа снятия стёка процедур.


Страницы:   1 2 3

Наверх

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