Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];

Вниз

Exception. Изменение сообщения ошибки.   Найти похожие ветки 

 
_RusLAN ©   (2006-04-14 11:25) [0]

Есть у меня процедура которая внутри себя исползует много других процедур и функций.
Если в какой-то внутренней функции возникла исключительная ситуация то я хочу поменять текст исключительной ситуации на описание места где это произошло и параметры + сам текст ошибки.
На даный момент я просто в каждой функции try except отлавливаю ошибки, создаю текст сообщения и через raise Exception.Create создаю новое исключение.
Правильно ли это, или можно как-то налету изменить текст ошибки.


 
Kolan ©   (2006-04-14 11:53) [1]

Ну если не лень... Для таких дел лог подходит... Да и не лучьше ли писать без ошибок?


 
Сергей М. ©   (2006-04-14 12:04) [2]

procedure TTestForm.Button2Click(Sender: TObject);
var
 i: Integer;
 e: exception;
begin
 i := 0;
 try
   i:= i div i;
 except
   e:= AcquireExceptionObject;
   try
     e.message := "Ìîé òåñêò ñîîáùåíèÿ îá èñêëþ÷åíèè";
     raise e;
   finally
     ReleaseExceptionObject;
   end;
 end;
end;


 
_RusLAN ©   (2006-04-14 13:07) [3]

Сергей М. ©   (14.04.06 12:04) [2]
Спасибо.


 
jack128 ©   (2006-04-14 14:34) [4]

Сергей М. ©   (14.04.06 12:04) [2]
зачем так сложно то делать, есть же специальные языковые конструкции:

procedure TTestForm.Button2Click(Sender: TObject);
begin
try
  raise Exception.Create("Old Exception message");
except
  on E: Exception do
  begin
    E.Message := "New Exception message";
    raise;
  end;
end;
end;


 
Сергей М. ©   (2006-04-14 14:44) [5]


> jack128 ©   (14.04.06 14:34) [4]


Держи-ка "простое" :

procedure TTestForm.Button2Click(Sender: TObject);
var
 i: Integer;
begin
 i:= 0;
try
 i := i div i;
except
 on E: Exception do
 begin
   E.Message := "New Exception message";
   raise;
 end;
end;
end;

и призадумайся ..


 
_RusLAN ©   (2006-04-14 15:38) [6]

Сергей М. ©   (14.04.06 14:44) [5]
jack128 ©   (14.04.06 14:34) [4]

Насколько я понимаю, это почти аналогично моему варинту, только в ваших сохраняеться класс исключительной ситуации(хотя мне это не важно) + меньше кода писать.

try
. . .
except
 on E:Exception do
 begin
   raise EDatabaseError.CreateFmt("Ошибка записи GID в локальную БД. %s%s",
     [ #10#13, E.Message]);
 end;
end;

Так что я переделывать не буду, но в дальнейшем буду пользоваться вашим вариантом.
Спасибо.


 
Сергей М. ©   (2006-04-14 15:55) [7]


> в ваших сохраняеться класс исключительной ситуации


Думаю, ты ошибаешься.

В наших (моем и уважаемого jack128 (С)) примерах глубоко начхать на класс объекта, отражающего контекст искл.ситуации..


 
_RusLAN ©   (2006-04-14 16:26) [8]

Попробовал такой код

try
 try
   raise EDivByZero.Create("0");
 except
   on E:Exception do
   begin
     E.Message := "Divizion by zero";
     raise;
   end;
 end;

 except
   on EDivByZero do MessageDlg("EdivByZero Class", mtWarning, [mbOK], 0);
 else MessageDlg("Else", mtWarning, [mbOK], 0);
 end;

Получаю собщение "EdivByZero Class", значит класс все-таки сохранился


 
jack128 ©   (2006-04-14 16:32) [9]

Сергей М. ©   (14.04.06 14:44) [5]
призадумался ;-) Я так понял, что raise - поднимет текущее системное исключение, а не дельфийский (EZeroDevine), при этом дельфийский объект будет уничтожен (_RaiseAgain).  При проходе следующего обработчика исключений (Application.HandleException)  EZeroDevine будет создан снова. естественно с текстом по умолчанию.  

При твоем подходе ты просто блокируешь сис. исключение и поднимаешь дельфийское..
Правда зачем нужна ReleaseExceptionObject я не понял.

_RusLAN ©   (14.04.06 16:26) [8]
Получаю собщение "EdivByZero Class", значит класс все-таки сохранился

а с чего бы ему менятся ;-)


 
jack128 ©   (2006-04-14 16:35) [10]

_RusLAN ©   (14.04.06 16:26) [8]
поведение моего кода и кода Сергея будет радикально отличатся при обработке исключений, поднимаемых не дельфийским кодом. см [5]


 
Сергей М. ©   (2006-04-14 16:35) [11]


> jack128 ©   (14.04.06 16:32) [9]


> зачем нужна ReleaseExceptionObject я не понял.


Потрудись исследовать этот момент ради автора).

Acquire - инкремент ссылки.
Release - декремент.

Возможно, я и не оч прав был.

Но факт есть факт.


 
jack128 ©   (2006-04-14 16:38) [12]

Сергей М. ©   (14.04.06 16:35) [11]
Release - декремент.


дельфи 2006
procedure ReleaseExceptionObject;
begin
end;
 ?


 
Сергей М. ©   (2006-04-14 16:40) [13]


> jack128 ©   (14.04.06 16:35) [10]


т.о. следует различать общесистемные исключения и прикладные Делфи-исключения.

Для искл-но прикладных исключений, согласен, схема вида

procedure TTestForm.Button2Click(Sender: TObject);
begin
try
 raise Exception.Create("Хрень");
except
 on E: Exception do
 begin
   E.Message := "Другая хрень";
   raise;
 end;
end;
end;

имеет право на жизнь.


 
Сергей М. ©   (2006-04-14 16:41) [14]


> jack128 ©   (14.04.06 16:38) [12]
> дельфи 2006


Судить не берусь - продукт мне не знаком.


 
_RusLAN ©   (2006-04-14 17:17) [15]

jack128 ©   (14.04.06 16:38) [12]
дельфи 2006
procedure ReleaseExceptionObject;
begin
end;  ?


У меня в модуле System два варианта этой процедуры, один пустой, а другой:

procedure ReleaseExceptionObject;
asm
       CALL    CurrentException
       OR      EAX, EAX
       JE      @@Error
       CMP     [EAX].TRaisedException.RefCount, 0
       JE      @@Error
       DEC     [EAX].TRaisedException.RefCount
       RET
@@Error:

{
 This happens if there is no exception pending, or
 if the reference count on a pending exception is
 zero.
}
       JMP   _Run0Error
end;

Наверно у Вас тоже так.


 
Leonid Troyanovsky ©   (2006-04-15 05:36) [16]


> Сергей М. ©   (14.04.06 14:44) [5]

>    E.Message := "New Exception message";
>    raise;


Какая-то сомнительная конструкция.
IMHO, либо показать свое сообщение,
либо создать свое исключение.

> и призадумайся ..

А чего там думать, снять галку break on exception,
или как ее там.

--
Regards, LVT.


 
jack128 ©   (2006-04-17 11:35) [17]

Leonid Troyanovsky ©   (15.04.06 5:36) [16]
Какая-то сомнительная конструкция.


не, самая натуральная как раз.  в блоке except-end исключение после raise можно не указывать, будет reraise"тся текущее.
стандартный обработчик:

Transaction.StartTransaction;
try
 ...
 Transaction.Commit;
except
 Transaction.Rollback;
 raise;
end;


 
Сергей М. ©   (2006-04-17 11:38) [18]


> Leonid Troyanovsky ©   (15.04.06 05:36) [16]


> снять галку break on exception


Она-то тут причем ?


 
Leonid Troyanovsky ©   (2006-04-17 22:30) [19]


> jack128 ©   (17.04.06 11:35) [17]

> не, самая натуральная как раз.  в блоке except-end исключение
> после raise можно не указывать, будет reraise"тся текущее.


Я сомневался лишь в одном: E.Message := ..; raise.
Подобная конструкция, скажем, в D3 текст исключения не меняла.
Да и нет в них нужды, бо как говорил ранее.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2006-04-17 22:41) [20]


> Сергей М. ©   (17.04.06 11:38) [18]

>> снять галку break on exception

> Она-то тут причем ?

Такова сермяжная правда жизни.
Кажись, сейчас оно зовется не break, but stop on exception,
и можно выбрать классы исключений.

Из проводника пробывал запускать свой пример?
Хотя, конечно, может быть, то, что в [19] еще актуально,
проверить не могу, бо под рукой дельфи нет.

Т.е., возможно, что в примере было две ошибки :)

--
Regards, LVT.


 
jack128 ©   (2006-04-18 02:01) [21]

Leonid Troyanovsky ©   (17.04.06 22:30) [19]
Я сомневался лишь в одном: E.Message := ..; raise.
Подобная конструкция, скажем, в D3 текст исключения не меняла.

хм.  с дельфи 3 имел дело только в 10 классе, а тогда я об исключения даже не знал :-)  но в пятерке вроде работала такая конструкция.


 
Германн ©   (2006-04-18 03:12) [22]


> Leonid Troyanovsky ©   (17.04.06 22:30) [19]
</I
> Leonid Troyanovsky ©   (17.04.06 22:41) [20]

>
Очень-но сомнительное сочетание двух ответов. Имхо.


 
tesseract ©   (2006-04-18 10:10) [23]

а можно без Raise??? например


on E.Exeption do logexception(e.message, modulename);


 
Leonid Troyanovsky ©   (2006-04-18 19:51) [24]


> Германн ©   (18.04.06 03:12) [22]

> Очень-но сомнительное сочетание двух ответов. Имхо.


И в чем сомнения?

Просто, про D3 я многие вещи помню наизусть, а для D6
придется испытывать, но под рукой нет.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2006-04-18 20:19) [25]


> tesseract ©   (18.04.06 10:10) [23]

> on E.Exeption do logexception(e.message, modulename);


Обычно, примерно так и поступают ( в нашем случае,
используя свою строку вместо e.message).

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

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2006-04-18 21:23) [26]


> Leonid Troyanovsky ©   (18.04.06 20:19) [25]

> Новое исключение может добавить  первоначальному тексту


Немного не точно. Смысл частичной обработки в том, что
если локальный обработчик не может самостоятельно справиться
со всей проблемой, он (возможно, выправив понятное ему)
возбуждает исключение другого класса, понятное для
обработчиков верхнего уровня.
Ну, а в текст исключения включается информация и от него,
как описано ранее.

--
Regards, LVT.



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

Форум: "Основная";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.015 c
8-1134388588
Ботвин Дмитрий
2005-12-12 14:56
2006.05.28
Несколько звуковых карт


2-1147372734
BAngel
2006-05-11 22:38
2006.05.28
Обмен переменными между процедурами


2-1147336472
kyn66
2006-05-11 12:34
2006.05.28
Запутался в запросе


2-1147329642
zorik
2006-05-11 10:40
2006.05.28
Как выделить в Екселе лист по его названию?


3-1143442511
barakuda
2006-03-27 10:55
2006.05.28
Размещение базы в ИНТЕРНЕТ





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