![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
так ведь для этого ведь и делалось)
|