Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Отлов исключительных ситуаций


Автор: mspuz 23.5.2006, 12:05
Проблема в следующем - есть клевая штука Application.OnException, но она работает только в приложениях, имеющих форму. А как мне её использовать енту штуку в консольном приложении? Или есть альтернатива? 

Автор: Snowy 23.5.2006, 12:16
try .. except/finally 

Автор: mspuz 23.5.2006, 12:21
Snowy, Да это-то я знаю, но есть ошибки, которые я не могу отловить, ну не предусмотрел я их и что тогда??? А тут такая удобная штука, неужели ничего нет для консолей??? 

Автор: Snowy 23.5.2006, 12:32
Ставь весь код в глобальный try .. except.
В except делай обратно вызов главной процедуры.

Добавлено @ 12:33 
В консольных приложениях нет глобального управляющего объекта.
Поэтому некому управлять - делай ручками. 

Автор: Демо 23.5.2006, 13:51
Дополню предыдущий ответ примером:

Код

try 
  ... 
except 
  on EZeroDivide do HandleZeroDivide; 
  on EOverflow do HandleOverflow; 
  on EMathError do HandleMathError; 
else 
  HandleAllOthers; 
end


(Из Help).  

Автор: Yanis 23.5.2006, 20:33
Цитата(mspuz @  23.5.2006,  13:05 Найти цитируемый пост)
Или есть альтернатива?  

Есть. Нужно переназначить обработчик исключений. На примере думаю станет ясно:
Код
program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils;

procedure MyExceptHandler(ExceptObject: TObject; ExceptAddr: Pointer); far;
begin
  WriteLn('My global exception handler.'#13#10'Error at address ', Integer(ExceptAddr));
  ReadLn;
  ShowException(ExceptObject, ExceptAddr);
  Halt(1);
end;

var
  x,i: Integer;
begin
  ExceptProc := @MyExceptHandler;
  ReadLn;
  x := 0;
  i := 0;
  x := x div i;
  WriteLn(x);
end.
 

Автор: Демо 23.5.2006, 20:54
Yanis

Это для TApplicaion. 

Автор: Yanis 23.5.2006, 20:56
Цитата(Демо @  23.5.2006,  21:54 Найти цитируемый пост)
Это для TApplicaion

С чего это? 

Автор: Демо 23.5.2006, 20:57
Хотя работает-)

Добавлено @ 20:58 
Цитата(Yanis @  23.5.2006,  20:56 Найти цитируемый пост)
С чего это? 


Да ни с чего это...-)
Не дочитал HElp-) 

Автор: Yanis 23.5.2006, 21:02
Цитата(Демо @  23.5.2006,  21:57 Найти цитируемый пост)
Хотя работает-)

Потому, что это перехватчик для исключительных ситуаций. И от TApplication он никак не зависит, на сколько мне известно smile 

Автор: Dynamic 25.5.2006, 14:53
<OFFTOP>
Yanis, поздравляю с 1000-м сообщением!
</OFFTOP> 

Автор: Rennigth 25.5.2006, 16:08
mspuz
у джидаев (JEDI) есть реализованые штуки для таких целей...
модуль называется JclHookExcept

там нужно что-то вроде:
Код

uses
  JclHookExcept...

var
  Kernel32_RaiseException: procedure (dwExceptionCode, dwExceptionFlags,
    nNumberOfArguments: DWORD; lpArguments: PDWORD); stdcall;

Implimrntation

procedure InitializeHookException;
begin
  Kernel32_RaiseException := GetProcAddress(
    GetModuleHandle(kernel32), 'RaiseException');
  JclHookExceptions(@HookedRaiseExceptionProc);
end;

procedure FinalizeHookException;
begin
  JclUnHookExceptions(@HookedRaiseExceptionProc);
end;

procedure HookedRaiseExceptionProc(ExceptionCode, ExceptionFlags, NumberOfArguments: DWORD;
  Arguments: PExceptionArguments); stdcall;
begin
//обработка
end;


по идее должна подойти
 

Автор: Rennigth 25.5.2006, 16:27
поправочка:
Код

uses
  JclHookExcept...

var
  Kernel32_RaiseException: procedure (dwExceptionCode, dwExceptionFlags,
    nNumberOfArguments: DWORD; lpArguments: PDWORD); stdcall;

implementation

procedure InitializeHookException;
begin
  Kernel32_RaiseException := GetProcAddress(
    GetModuleHandle(kernel32), 'RaiseException');
  JclHookExceptions(@HookedRaiseExceptionProc);
end;

procedure FinalizeHookException;
begin
  JclUnHookExceptions(@HookedRaiseExceptionProc);
end;

procedure HookedRaiseExceptionProc(ExceptionCode, ExceptionFlags, NumberOfArguments: DWORD;
  Arguments: PExceptionArguments); stdcall;
begin
//обработка

(* это чтобы после обработки если надо отдать системе exception *)
Kernel32_RaiseException(
    ExceptionCode, ExceptionFlags, NumberOfArguments, PDWORD(Arguments));
end;
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)