Форум: "Основная";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];
ВнизПерехват всех ошибок в консольных приложениях Найти похожие ветки
← →
Сало © (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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.037 c