Обработчик ошибок

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
duke
Сообщения: 3
Зарегистрирован: 05 июл 2004, 14:40
Контактная информация:

05 июл 2004, 14:44

Есть программа, давольно большая , нужно сделать так чтоб где какая ошибка не произошла, выводилось мое сообщение. Как это можно устроить?
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

05 июл 2004, 14:49

try
...
except
on e:Exception do ShowMessage('еггог' +e.Message);
end;
Даже самый дурацкий замысел можно воплотить мастерски
duke
Сообщения: 3
Зарегистрирован: 05 июл 2004, 14:40
Контактная информация:

05 июл 2004, 14:52

У меня несколько модулей, что в каждом модуле ставить???
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

05 июл 2004, 14:57

Это тебе виднее должно быть.
Даже самый дурацкий замысел можно воплотить мастерски
GOS
Сообщения: 111
Зарегистрирован: 17 фев 2004, 10:32
Контактная информация:

05 июл 2004, 21:47

Я слышал что можно ошибки сразу обрабатывать, а можно переносить на уровень выше...
Что это значит?
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

05 июл 2004, 22:02

Да то и значит, что либо просто забиваешь на обработку ошибки, либо в секции except
"возбуждаешь" ошибку по-новой. Ну или вообще новую ошибку. См. raise

Кстати, если в проекте используется VCL, то для решения поставленной задачи можно воспользоваться событием onException:

Код: Выделить всё

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnException := AppException;
end;

procedure TForm1.AppException(Sender: TObject; E: Exception);
begin
  ShowMessage('blabla' +E.Message);
  Application.Terminate;
end;
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

05 июл 2004, 22:33

duke, наверняка в Вашем приложении всего один инстанс TApplication, который собственно и называется Application. Все ошибки, которые возникли вне try...except...end (независимо от места возникновения) обрабатываются им, однако наверняка найдутся ошибки после которых, к сожалению, нельзя восстановиться. Правда в любом случае их можно поймать и попытаться что-нибудь сделать. По крайне мере легко можно вывести свой текст вместо "Access violation".

Для этого нужно сделать:
Application.OnException:=Объект.Обработчик_ошибок;

Обработчик_ошибок должент быть методом какого-нибудь объекта. Можно конечно использовать для этого форму (например главную, если она создается только один раз, и при этом первой), и тогда в обработчике FormCreate пишем:
Application.OnException:=Form1.MyHandler;
а в FormDestroy:
Application.OnException:=nil;

Однако я бы определил в отдельном модуле отдельный класс с единственной процедурой и создавал бы экземпляр этого класса ДО создания всех форм, чтобы поймать ошибки, могущие фозникнуть до инициализации главной формы или в процессе ее уничтожения.

Сам метод MyHandler должет быть таким:

Код: Выделить всё

class
  T___ = ...
    ....
    procedure MyHandler(Sender: TObject; E: Exception);
    ....
  end;

...


procedure T___.MyHandler(Sender: TObject; E: Exception);
begin
  if E is EMathError then begin
    E.Message := 'Какая-то математическая ошибка';
    ...
  end else if E is EBDEError then begin
    ...
  end ...
    ...
  end;
  ... // Тут можно сделать запись в лог-файл, и т.д. и т.п.
  Application.ShowException(E);
  Application.Terminate;
end;
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

05 июл 2004, 23:26

GOS писал(а):Я слышал что можно ошибки сразу обрабатывать, а можно переносить на уровень выше...
Что это значит?
все try-except могу оказаться вызванными вложенно. Наример,

Код: Выделить всё

try
  X&#58]


Между тем в procedure TXClass.Create может тоже использоваться try-except.
[code]
try
  ...
except
  // место обработки 2
  //обработать математическую ошибку здесь
  on EMathError do HandleMathError; 
  //обработать BDE-ошибку здесь
  on EDBError do HandleBDEError; 
  //передать прочие ошибки на уровень выше (в место_обработки_1)
  else raise;
end;
Заморочки с вызовом конструктора класса TXClass я тут привел для большей иллюстративности. Однако, это правило выполняется и для просто вложенных друг в друга try-except!
Ответить