Форум: "Прочее";
Текущий архив: 2013.05.19;
Скачать: [xml.tar.bz2];
ВнизGetLastError своими руками. Найти похожие ветки
← →
O'ShinW © (2013-01-10 11:34) [0]Подскажите как проще, кто делал.
Хочу написать класс, который должен вести себя либо стандартно,
либо замалчивать ошибки, если его попросят.
FLastError: string;
FSilent: Boolean;
Как последнюю ошибку сохранять - понятно: обернуть в try except и
если FSilent то Exception.message сохранять в FLastError
иначе перевозбуждать.
Интереснее, как ее сбрасывать...
Не писать же после каждого оператора FLastError := "";
?
← →
брат Птибурдукова (2013-01-10 11:42) [1]
> Интереснее, как ее сбрасывать...
try finally вместо try except. try except, в котором последним оператором будет очистка FLastError
ЗЫ. Что-то идея «попахивает» имхо.
← →
Игорь Шевченко © (2013-01-10 11:56) [2]Зачем ?
← →
O'ShinW © (2013-01-10 12:07) [3]
> Игорь Шевченко © (10.01.13 11:56) [2]
> Зачем ?
Интересно.
хочется понять/сделать так, как GetLastError работает
>
брат Птибурдукова
на каждый метод последним оператором - думал
да, наверное, так придется.
> Что-то идея «попахивает»
немного, наверное ,да.
но хочется понять/сделать так, как GetLastError работает
+ думаю, объявить св-во, LastError, в сеттере которого вызывать некую нотификацию, если она assigned
← →
sniknik © (2013-01-10 12:08) [4]> Интереснее, как ее сбрасывать...
не сбрасывай, GetLastError тоже не сбрасывается, только перезаписывается результатами новых операций (обычно там 0 - выполнено успешно). делай так же, раз уж "стандартно" то до конца.
← →
Игорь Шевченко © (2013-01-10 13:10) [5]
> хочется понять/сделать так, как GetLastError работает
GetLastError работает очень просто - в блоке окружения потока есть переменная, она присваивается.
Для понимания работы GetlastError достаточно понять принцип работы операции присваивания
← →
O'ShinW © (2013-01-10 13:26) [6]
> в блоке окружения потока есть переменная, она присваивается
+
> GetLastError тоже не сбрасывается, только перезаписывается
> результатами новых операций
т.е. после каждой успешной операции писать 0 в некую переменную руками?
И никак не автоматизировать это присваивание?
(понимаю, что скорее всего - нет. Но может есть идея какая-нить)
← →
Игорь Шевченко © (2013-01-10 13:34) [7]Зачем ?
← →
Inovet © (2013-01-10 13:36) [8]> [6] O"ShinW © (10.01.13 13:26)
> т.е. после каждой успешной операции писать 0 в некую переменную руками?
Функция возвращает что-то в том числе признак ошибки, вот в ней вместе с этим признаком и присваювать расшифровку в эту переменную. А при успехе должна остаться последняя ошибка, как бы из названия следует.
← →
брат Птибурдукова (2013-01-10 13:39) [9]Пиши ноль на старте. Если его до финиша не перезатёрли, значит жизнь удалась.
← →
icWasya © (2013-01-10 13:58) [10]Например, функция IoResult возвращает код ошибки операций ввода-вывода (при опции {$I-}), который записан в некую внутреннюю переменную, и сбрасывает эту переменную в ноль.
← →
O'ShinW © (2013-01-10 14:29) [11]например, класс сам возбуждает свои исключения, что бы пользователь заранее выбрал модель поведения
либо все бросить
либо продолжать, раз он так уверен в том, что это можно.
procedure MyClass.MethodM(Param: TMyParam);
begin
if not(Check(Param) ) then
if FSilent then
begin
InternalAddError("Param is wrong"); // <-- тут MyGetLastError и еще что-то, если надо, заполняеется
Exit;
end else
raise Exception.Create("Param is wrong");
// или показать окно, типа, "Param is wrong, continue?"
и т.п.
И где-то
MyClass.Fsilent := True;
// или Fsilent := CalculateMode; // допустим в отладке или в составе некоторого web-приложения лучше сейчас логгировать
MyClass.MethodM(GetMyParam.next); // вызов1
MyClass.MethodQQQQ(); // вызов2
..
При вызове №1 была логическая ошибка "Check(Param)", и больше ее не было
Тем не менее и после вызова №2(, 3, 4) она осталась в переменной MyGetLastError.
- Тут, как вариант, писать в конце всех методов, последней строкой, MyGetLastError := 0;
А..!
Если метод вызывает другой свой метод, который установил MyGetLastError в не 0..
тогда и этот метод должен вернуть вызывающему не 0, а переданную ему, возможно, модифицировав.
тогда получается, каждый метод должен иметь + еще одну var переменную, который вызывающий интерпретирует как MyGetLastError
вроде, так.
← →
Игорь Шевченко © (2013-01-10 14:58) [12]O"ShinW © (10.01.13 14:29) [11]
До полного и окончательного просветления:
http://delphikingdom.com/asp/viewitem.asp?catalogid=1392
← →
O'ShinW © (2013-01-10 15:37) [13]
> Игорь Шевченко ©
да понятно, что там все хорошо написано.
Игорь, а ты сам всегда так пишешь? :)
ну.. к тому, что иногда некогда 2.6.8. Пишите код в двух вариантах
или Не используйте исключения в обычных ситуациях (логгировать проще, объявив ошибкой, т.к. все ошибки уже пишутся самым верхним обработчиком)
← →
Игорь Шевченко © (2013-01-10 15:47) [14]
> Игорь, а ты сам всегда так пишешь? :)
Я всегда пишу хорошо
← →
O'ShinW © (2013-01-14 13:47) [15]тогда так:
Родил Класс TErrProducer
EP := TErrProducer.Create;
EP.CallBackStack := OnCallBackEP; // любая ошибка в лог
EP.RegisterNew("None","None", 0); // по-умолчанию, все необработанные. 0 - недопустимо ни одной, сразу информировать
EP.AddMailByTypSrc("None","None","v.oshin@xxxxxxxx.ru");
procedure TForm1.Button1Click(Sender: TObject);
begin
// где-то случилось, не специально
raise Exception.Create("Любая необработанная, должна быть ошибка вида None-None и будет перехвачено на последнем уровне в EP.AddError(E.Message,"None","None")");
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if not(Connection.open) then
EP.AddError("некая ошибка","Connection","Button2Click;Connection.open") else
// ожидаемая, типа Connection, в методе Button2Click; строка Connection.open
EP.ResetErrors("Connection","Button2Click;Connection.open"); // сброс ошибок такого типа в 0
// или EP.ResetErrors("Connection");
end;
предварительно, либо ее регистрируем
EP.RegisterNew("Connection","Button2Click;Connection.open", 1); // допускается не с первого раза аxтунг поднимать
(либо она сама регистрируется, при первом добавлении, с допуском ошибок по умолчанию)
и регистрируем способ информации EP.AddSmsByTypSrc("Connection","Button2Click;Connection.open","7960xxxxxxx"); // две попытки на открытие, иначе СМС мне
EP.AddMailByTypSrc("Connection","Button2Click;Connection.open","qwert@qwqw.ru"); // и письмо дежурному
← →
Игорь Шевченко © (2013-01-14 13:56) [16]O"ShinW © (14.01.13 13:47) [15]
Дети Ивана Кулибина
← →
O'ShinW © (2013-01-14 14:25) [17]я никак золотую середину не найду.
То всю память в телефоне смсками закидает / почту забьёт (не только мне :))
а то пропускается время реакции.
Вот и задался вопросом написания менеджера ошибок.
Заодно в других проектах потом юзать что бы.
Зарядил его на конкретную ошибку, допуск 5, допустим, (вдруг сети нет, или кто-то что-то перегружает, и пока не доступно). И 5 ошибок подряд одного типа игнорятся
зы
И надо бы еще время задержки после информирования вставить. Если что не так - проинформировал уже, в след.раз после FSomeTime времени напомнить, что еще не устранена проблема.
Во! или что устранено. Надо в EP.ResetErrors( вставить, пожалуй
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.05.19;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.003 c