Форум: "Основная";
Текущий архив: 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 - декремент.
дельфи 2006procedure 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.51 MB
Время: 0.012 c