Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.18;
Скачать: CL | DM;

Вниз

Перехват всех ошибок в консольных приложениях   Найти похожие ветки 

 
Сало ©   (2007-01-23 14:49) [0]

Если в GUI приложениях можно использовать ApplicationEvents, то в в консольных использование этого компонента не целесообразно. Как же обработать все исключения, возникшие в консольном приложении и не обработанные локально?
В библиотеке JCL можно перехватить все ошибки, но все равно
ошибка вылетает...


 
tesseract ©   (2007-01-23 14:57) [1]

Try.. except  - он сильно локален?


 
Джо ©   (2007-01-23 15:02) [2]

program Salo;

begin
 try
   // программа
 except
   // обработка
 end;
end.

Казалось, куда проще? :)


 
Сергей М. ©   (2007-01-23 15:11) [3]


> Как же обработать все исключения, возникшие в консольном
> приложении и не обработанные локально?


Никак.
И в GUI-приложении, использующем тот самый якобы "волшебный" ApplicationEvents - тоже никак.

Под "никАком" подразумевается общий случай - процесс приложения может иметь более чем один кодовый поток, что подразумевает индивидуальную "ручную" обработку исключений в каждом из потоков, за исключением основного, где "чайник" до поры до времени может надеяться на Application.OnException


 
Сало ©   (2007-01-23 15:29) [4]

Да ладно. JCL замещает вызов системного RaiseException своим. Но!

procedure HookedRaiseException(ExceptionCode, ExceptionFlags, NumberOfArguments: DWORD;
 Arguments: PExceptionArguments); stdcall;
const
 cDelphiException = $0EEDFADE;
 cNonContinuable = 1;
begin
 if (ExceptionFlags = cNonContinuable) and (ExceptionCode = cDelphiException) and
   (NumberOfArguments = 7) and (DWORD(Arguments) = DWORD(@Arguments) + 4) then
     DoExceptNotify(Arguments.ExceptObj, Arguments.ExceptAddr, False);
 Kernel32_RaiseException(ExceptionCode, ExceptionFlags, NumberOfArguments, PDWORD(Arguments));
end;

Если закомментировать вызов Kernel32_RaiseException, то получаю privileged instruction. Что делать?


 
Сергей М. ©   (2007-01-23 15:56) [5]


> Сало ©   (23.01.07 15:29) [4]


К [3] это не имеет ни малейшего отношения.


 
Сало ©   (2007-01-23 16:32) [6]

В каждом потоке можно также подменить RaiseException, в чем проблема?


 
Игорь Шевченко ©   (2007-01-23 16:37) [7]


> Как же обработать все исключения, возникшие в консольном
> приложении и не обработанные локально?


SetUnhandledExceptionFilter ? :)
http://msdn2.microsoft.com/en-us/library/ms680634.aspx


 
властелин колхоза   (2007-01-23 17:06) [8]

> [2] Джо ©   (23.01.07 15:02)
Раз уж об этом речь зашла...

{$APPTYPE CONSOLE}
program Salo;

var
 A,B:Integer;

begin
try
  ReadLn(A);
  B:=10 div A;
  WriteLn(B);
  ReadLn;
except
  WriteLn("Страшенная ошибка!");
  ReadLn;
end;
end.

при вводе А=0 тихо вылетает.

{$APPTYPE CONSOLE}
program Salo;

uses
 SysUtils;

var
 A,B:Integer;

begin
try
  ReadLn(A);
  B:=10 div A;
  WriteLn(B);
  ReadLn;
except
  WriteLn("Страшенная ошибка!");
  ReadLn;
end;
end.

в аналогичных условиях выводит в консоль сообщение об ошибке. Почему?


 
Джо ©   (2007-01-23 17:10) [9]

> Почему?

Для корректной работы конструкции try/except именно и необходим SysUtils, чего же тут непонятного? :)
П.С. Там в секции инициализации SysUtils.pas имеется вызов InitExceptions, который, собственно, назначает все обработчики исключений.



Страницы: 1 вся ветка

Текущий архив: 2007.03.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.064 c
8-1152681553
leonidus
2006-07-12 09:19
2007.03.18
Как запрограммировать эффект лупы?


2-1172252904
rar
2007-02-23 20:48
2007.03.18
преобразовть формат DateTime


2-1172146584
ANTPro
2007-02-22 15:16
2007.03.18
SetCapture


2-1171970778
sashakbest
2007-02-20 14:26
2007.03.18
Памогите, кто знаете


15-1172092407
Gero
2007-02-22 00:13
2007.03.18
Креативные часы от Лебедева