Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.039 c
15-1171741571
lookin
2007-02-17 22:46
2007.03.18
Приветствую


15-1171614345
KSergey
2007-02-16 11:25
2007.03.18
Проверка перфоратора


2-1172263631
Allexandr
2007-02-23 23:47
2007.03.18
Процедуры


2-1172402809
Riply
2007-02-25 14:26
2007.03.18
ReallocMem и сохранность "первых" байт информации.


15-1171886128
DrDe
2007-02-19 14:55
2007.03.18
Каким Диалектом в FireBird вы пользуетесь?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский