Форум: "Начинающим";
Текущий архив: 2009.05.31;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c