Главная страница
    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.037 c
3-1166612920
KIR
2006-12-20 14:08
2007.03.18
Перенести данные из XL в InterBase


15-1171831724
Leonid Troyanovsky
2007-02-18 23:48
2007.03.18
Таракан


15-1172322646
Суслик
2007-02-24 16:10
2007.03.18
Delphi Turbo for Win32 Prof VS Delphi for Win32 Prof


15-1172239795
isasa
2007-02-23 17:09
2007.03.18
"Легкий"(для малого офиса) Mail Server


15-1171727368
hhjjkk
2007-02-17 18:49
2007.03.18
Как ПОЛНОСТЬЮ удалить 1С с компа?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский