Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.11.2010, 22:47
mirt steelwater mirt steelwater вне форума
Прохожий
 
Регистрация: 17.10.2010
Сообщения: 35
Репутация: 10
Радость Отлавливание исключений в своих классах

При реализации своих классов необходимо качественно отлавливать возможные ошибки. Желательно, чтобы в сообщениях об ошибке было указано - в каком исполняемом модуле (имя 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  
Старый 02.11.2010, 23:04
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Цитата:
Сообщение от mirt steelwater
{F2BAAC2B-2617-4FC2-BEF1-F1F71D33DD19}
И потом издавать многотомный справочник по твоим кодам?

Смотря какую цель ты преследуешь...

Если хочешь чтобы кроме тебя кто-то пользовался твоими творениями, тогда:
Описание ошибки, и её возможное решение.
Ответить с цитированием
  #3  
Старый 03.11.2010, 08:50
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
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  
Старый 03.11.2010, 21:17
mirt steelwater mirt steelwater вне форума
Прохожий
 
Регистрация: 17.10.2010
Сообщения: 35
Репутация: 10
По умолчанию

Поясню зачем это нужно
Во-первых, никакие многтомные справочники не нужно..
что такое GUID - уникальный идентификатор - увидели ошибку, рядом с ней написан ее идентификатор, запустили поиск по проекту и со 100% вероятностью вывалились куда нужно.
Во-вторых, Assert такой возможности не дает, ибо привязан к номеру строки, ее давай ищи.. кроме того, он не поддерживает вложенности, его нельзя логировать. здесь же результирующее исключение можно подавить и записать в лог.
Ответить с цитированием
  #5  
Старый 05.11.2010, 10:01
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

логируй:

Код:
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  
Старый 10.11.2010, 21:59
mirt steelwater mirt steelwater вне форума
Прохожий
 
Регистрация: 17.10.2010
Сообщения: 35
Репутация: 10
По умолчанию

ок, а где здесь имя класса? вообщем твой подход мне известен, но бывает (в очень больших проектах - как у меня, причем с оверлодами методов), что этого мало для быстрого поиска - вот так и крутимся, кроме того, все равно прийдется этот ассерт вешать в except on E: Exception , а дальше в него передавать сообщение ошибки - имхо в чем разница?

Последний раз редактировалось mirt steelwater, 10.11.2010 в 22:06.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:46.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025