Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.05.19;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.008 c
2-1351231746
i2e
2012-10-26 10:09
2013.05.19
запуск файла по двойному клику


2-1351019519
Dronchik1173
2012-10-23 23:11
2013.05.19
Вычисление CRC CCITT


15-1354720674
xayam
2012-12-05 19:17
2013.05.19
Любителям шахмат (и не только) посвящается


15-1358003444
MonoLife
2013-01-12 19:10
2013.05.19
Перевести на C++


15-1358191571
Vagner
2013-01-14 23:26
2013.05.19
Как выключить ПК в сети?