Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1239684656
Alex_C
2009-04-14 08:50
2009.05.31
Изменение размеров динамических массивов


2-1240209047
Destroyer
2009-04-20 10:30
2009.05.31
Microsoft SQL Server и Delphi


2-1240085511
VoznikVopros
2009-04-19 00:11
2009.05.31
Как ограничить Trace-режим ТОЛЬКО файлами проекта?


15-1238162684
axis_of_evil
2009-03-27 17:04
2009.05.31
печать .pdf со смещением


15-1238193839
KilkennyCat
2009-03-28 01:43
2009.05.31
Проект "Библиотека"





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