Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отлов исключительных ситуаций, в консольных приложениях 
V
    Опции темы
mspuz
Дата 23.5.2006, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



Проблема в следующем - есть клевая штука Application.OnException, но она работает только в приложениях, имеющих форму. А как мне её использовать енту штуку в консольном приложении? Или есть альтернатива? 
PM MAIL   Вверх
Snowy
Дата 23.5.2006, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



try .. except/finally 
PM MAIL   Вверх
mspuz
Дата 23.5.2006, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



Snowy, Да это-то я знаю, но есть ошибки, которые я не могу отловить, ну не предусмотрел я их и что тогда??? А тут такая удобная штука, неужели ничего нет для консолей??? 
PM MAIL   Вверх
Snowy
Дата 23.5.2006, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Ставь весь код в глобальный try .. except.
В except делай обратно вызов главной процедуры.

Добавлено @ 12:33 
В консольных приложениях нет глобального управляющего объекта.
Поэтому некому управлять - делай ручками. 
PM MAIL   Вверх
Демо
Дата 23.5.2006, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Дополню предыдущий ответ примером:

Код

try 
  ... 
except 
  on EZeroDivide do HandleZeroDivide; 
  on EOverflow do HandleOverflow; 
  on EMathError do HandleMathError; 
else 
  HandleAllOthers; 
end


(Из Help).  

Это сообщение отредактировал(а) Демо - 23.5.2006, 13:52


--------------------
    
PM MAIL ICQ Skype   Вверх
Yanis
Дата 23.5.2006, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(mspuz @  23.5.2006,  13:05 Найти цитируемый пост)
Или есть альтернатива?  

Есть. Нужно переназначить обработчик исключений. На примере думаю станет ясно:
Код
program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils;

procedure MyExceptHandler(ExceptObject: TObject; ExceptAddr: Pointer); far;
begin
  WriteLn('My global exception handler.'#13#10'Error at address ', Integer(ExceptAddr));
  ReadLn;
  ShowException(ExceptObject, ExceptAddr);
  Halt(1);
end;

var
  x,i: Integer;
begin
  ExceptProc := @MyExceptHandler;
  ReadLn;
  x := 0;
  i := 0;
  x := x div i;
  WriteLn(x);
end.
 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Демо
Дата 23.5.2006, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Yanis

Это для TApplicaion. 


--------------------
    
PM MAIL ICQ Skype   Вверх
Yanis
Дата 23.5.2006, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(Демо @  23.5.2006,  21:54 Найти цитируемый пост)
Это для TApplicaion

С чего это? 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Демо
Дата 23.5.2006, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Хотя работает-)

Добавлено @ 20:58 
Цитата(Yanis @  23.5.2006,  20:56 Найти цитируемый пост)
С чего это? 


Да ни с чего это...-)
Не дочитал HElp-) 


--------------------
    
PM MAIL ICQ Skype   Вверх
Yanis
Дата 23.5.2006, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(Демо @  23.5.2006,  21:57 Найти цитируемый пост)
Хотя работает-)

Потому, что это перехватчик для исключительных ситуаций. И от TApplication он никак не зависит, на сколько мне известно smile 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Dynamic
Дата 25.5.2006, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 372
Регистрация: 5.7.2004
Где: Салехард

Репутация: 12
Всего: 15



<OFFTOP>
Yanis, поздравляю с 1000-м сообщением!
</OFFTOP> 


--------------------
Было бы о чем молчать, а уж что сказать – всегда найдется...
PM MAIL WWW   Вверх
Rennigth
Дата 25.5.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



mspuz
у джидаев (JEDI) есть реализованые штуки для таких целей...
модуль называется JclHookExcept

там нужно что-то вроде:
Код

uses
  JclHookExcept...

var
  Kernel32_RaiseException: procedure (dwExceptionCode, dwExceptionFlags,
    nNumberOfArguments: DWORD; lpArguments: PDWORD); stdcall;

Implimrntation

procedure InitializeHookException;
begin
  Kernel32_RaiseException := GetProcAddress(
    GetModuleHandle(kernel32), 'RaiseException');
  JclHookExceptions(@HookedRaiseExceptionProc);
end;

procedure FinalizeHookException;
begin
  JclUnHookExceptions(@HookedRaiseExceptionProc);
end;

procedure HookedRaiseExceptionProc(ExceptionCode, ExceptionFlags, NumberOfArguments: DWORD;
  Arguments: PExceptionArguments); stdcall;
begin
//обработка
end;


по идее должна подойти
 


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Rennigth
Дата 25.5.2006, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



поправочка:
Код

uses
  JclHookExcept...

var
  Kernel32_RaiseException: procedure (dwExceptionCode, dwExceptionFlags,
    nNumberOfArguments: DWORD; lpArguments: PDWORD); stdcall;

implementation

procedure InitializeHookException;
begin
  Kernel32_RaiseException := GetProcAddress(
    GetModuleHandle(kernel32), 'RaiseException');
  JclHookExceptions(@HookedRaiseExceptionProc);
end;

procedure FinalizeHookException;
begin
  JclUnHookExceptions(@HookedRaiseExceptionProc);
end;

procedure HookedRaiseExceptionProc(ExceptionCode, ExceptionFlags, NumberOfArguments: DWORD;
  Arguments: PExceptionArguments); stdcall;
begin
//обработка

(* это чтобы после обработки если надо отдать системе exception *)
Kernel32_RaiseException(
    ExceptionCode, ExceptionFlags, NumberOfArguments, PDWORD(Arguments));
end;
 


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1171 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.