Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.31;
Скачать: CL | DM;

Вниз

Raise   Найти похожие ветки 

 
Franzy   (2009-04-14 14:28) [0]

У меня есть консольная программа, которая производит некий расчет. Если у меня появляется критическая ошибка алгоритма, я вызываю функцию Halt и передаю аргументом код этой ошибки.

Теперь мне нужно преобразовать эту консольную программу в длл. Встала проблема обработки ошибок. Теперь halt использовать нельзя, потому что моя основная функция в длл должна возвращать код ошибки (0 = ошибки нет).

Проблема в том, что некоторые из "хальтов" у меня находятся в процедурах, которые используются в разных частях программы и используются часто, и локально там обрабатывать результаты работы процедур довольно затруднительно.

Насколько я понимаю, мне нужно вставить в соотв. места блоки TRY..EXCEPT, а в этих самых процедурах вместо хальта создавать исключение, чтобы блок EXCEPT мог перехватить контроль.    

Пожалуйста, посмотрите пример листинга и скажите, правильно ли я все написал. Мне важно, чтобы длл-ка и основная прога могли спокойно продолжать работу в случае появления ошибки алгоритма (т.е чтобы обработка этой ошибки не ушла дальше блока try except).

//часто используемая процедура
procedure DoSmth(x,y : double);
begin
//......
if ErrorFlag then
 begin
   // было Halt(10)
   // стало
   raise;
 end;
end;

//Фрагмент программы, где используется процедура

function DoCompute : longint;
//возвращает код ошибки
begin
 //......

 try
  DoSmth(1,2);
  DoSmth(5,21)
  DoSmth(0,0)
 except
  Result:=10;
  Exit;
 end;
 
 //.....

 Result:=0;
end;


 
Franzy   (2009-04-14 14:30) [1]

Там где у меня raise должно быть raise exception.create;


 
Palladin ©   (2009-04-14 14:31) [2]

а exit то зачем?


 
Franzy   (2009-04-14 14:36) [3]

Чтобы не выполнялся код после блока except. //... - это значит большой кусок кода :))


 
Игорь Шевченко ©   (2009-04-14 14:43) [4]

"Корректно оформляйте заголовок ветки, который должен кратко отражать суть вопроса"
(с) rules


> Насколько я понимаю, мне нужно вставить в соотв. места блоки
> TRY..EXCEPT, а в этих самых процедурах вместо хальта создавать
> исключение, чтобы блок EXCEPT мог перехватить контроль.
>    
>
> Пожалуйста, посмотрите пример листинга и скажите, правильно
> ли я все написал. Мне важно, чтобы длл-ка и основная прога
> могли спокойно продолжать работу в случае появления ошибки
> алгоритма (т.е чтобы обработка этой ошибки не ушла дальше
> блока try except).


Вроде правильно. Я бы обертки написан вокруг уже сделанных функций, типа такого:

type
 EMyException = class(Exception)
 public
   ErrorCode: Integer;
   constructor Create(AErrorCode: Integer);
 end;

constructor EMyException.Create(AErrorCode: Integer);
begin
 inherited Create("");
 ErrorCode := AErrorCode;
end;

в написанных процедурах заменил бы halt(errorcode) на raise EMyException.Create(errorcode);

а в обертках написал бы
try
 Result := myOldFunction (...)
except
 on E: EMyExcaption do
   Result := E.ErrorCode;
end;
 
Но тему у ветки все равно надо оформлять, чтобы вопрос был понятен без чтения сообщения. Закрою ведь тему и буду прав.


 
Palladin ©   (2009-04-14 14:53) [5]


> Franzy   (14.04.09 14:36) [3]

собсна зачем лепить кучу try/except, достаточно сделать один большой try/except и уже там реагировать на происходящее, например как Игорь подсказал, так код будет куда проще...


 
Franzy   (2009-04-14 15:01) [6]

2Игорь Шевченко
Да, наверное, так и следует сделать. Спасибо за совет :)



Страницы: 1 вся ветка

Текущий архив: 2009.05.31;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
8-1194545729
NaRuTo
2007-11-08 21:15
2009.05.31
Как сделать так чтобы моя диаграмма скакала под бит музыки.


2-1240203801
Индеец
2009-04-20 09:03
2009.05.31
Перегрузка конструкторов


2-1239635428
pepper
2009-04-13 19:10
2009.05.31
FindWindowEx иMainMenu...


15-1238486183
desc
2009-03-31 11:56
2009.05.31
Что может быть ? Не могу откомпелировать компонент...


15-1238413691
Галинка
2009-03-30 15:48
2009.05.31
База данных для MySQL