Главная страница
    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.043 c
15-1172255894
mdaaaaaaa
2007-02-23 21:38
2007.03.18
Flash


2-1172235452
Цукор5
2007-02-23 15:57
2007.03.18
Format


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


2-1172323509
kail
2007-02-24 16:25
2007.03.18
Режим картинки


15-1172191674
vasIZmax
2007-02-23 03:47
2007.03.18
О "миллионе долларов"...





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