![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() При реализации своих классов необходимо качественно отлавливать возможные ошибки. Желательно, чтобы в сообщениях об ошибке было указано - в каком исполняемом модуле (имя dll или exe), в каком логическом модуле (имя unit-a), в каком классе и в каком методе класса возникло исключение. Также желательно передавать при этом в конструктор исключения минимум информации - например, только ссылку на экземпляр класса - self. Остальные параметры должны быть опциональны. Кроме того, желательно предусмотреть возможность указывать уникальный идентификатор в каждое исключение, для чего хорошо подходит GUID.
Вот этот модуль умеет все это делать. использовать это просто: interface {$M+} TMyClass = class public procedure MyMethod; end; {$M-} implementation procedure TMyClass.MyMethod; begin try ... except on E: Exception do raise EClass.Create ([self,'MyMethod','Ошибка моего метода!',E], ['{F2BAAC2B-2617-4FC2-BEF1-F1F71D33DD19}']); end; end; при возникновении исключения в этом методе мы увидим что-то вроде: {F2BAAC2B-2617-4FC2-BEF1-F1F71D33DD19} Project1.exe::Unit1::TMyClass.MyMethod : Ошибка моего метода! : ESomeError удобно также, что данный способ дает возможность использовать вложенность исключений. жду критики и предложений |
#2
|
||||
|
||||
![]() Цитата:
Смотря какую цель ты преследуешь... Если хочешь чтобы кроме тебя кто-то пользовался твоими творениями, тогда: Описание ошибки, и её возможное решение. |
#3
|
||||
|
||||
![]() Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Assert(False, 'procedure TForm1.Button1Click(Sender: TObject);'); end; end. ![]() Пишу программы за еду. __________________ |
#4
|
|||
|
|||
![]() Поясню зачем это нужно
Во-первых, никакие многтомные справочники не нужно.. что такое GUID - уникальный идентификатор - увидели ошибку, рядом с ней написан ее идентификатор, запустили поиск по проекту и со 100% вероятностью вывалились куда нужно. Во-вторых, Assert такой возможности не дает, ибо привязан к номеру строки, ее давай ищи.. кроме того, он не поддерживает вложенности, его нельзя логировать. здесь же результирующее исключение можно подавить и записать в лог. |
#5
|
||||
|
||||
![]() логируй:
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure AssertErrorHandler(const Message, Filename: string; LineNumber: Integer; ErrorAddr: Pointer); begin Form1.Memo1.Lines.Add(Message+#13#10+Filename+#13#10+IntToStr(LineNumber)); ShowMessage(Message+#13#10+Filename+#13#10+IntToStr(LineNumber)); end; procedure TForm1.Button1Click(Sender: TObject); begin Assert(False, 'Ошибка моего метода Button1Click'); end; initialization AssertErrorProc:=AssertErrorHandler; end. ![]() Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 05.11.2010 в 10:03. |
#6
|
|||
|
|||
![]() ок, а где здесь имя класса? вообщем твой подход мне известен, но бывает (в очень больших проектах - как у меня, причем с оверлодами методов), что этого мало для быстрого поиска - вот так и крутимся, кроме того, все равно прийдется этот ассерт вешать в except on E: Exception , а дальше в него передавать сообщение ошибки - имхо в чем разница?
Последний раз редактировалось mirt steelwater, 10.11.2010 в 22:06. |
#7
|
||||
|
||||
![]() Цитата:
Цитата:
Цитата:
другое дело когда происходит не обрабатываемое исключение. вот тогда предлагаемый способ оповещения Project1.exe::Unit1::TMyClass.MyMethod::ESomeError будет очень кстати. Пишу программы за еду. __________________ |
#8
|
|||
|
|||
![]() так ведь для этого ведь и делалось)
|