Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1357909379
boriskb
2013-01-11 17:02
2013.05.19
Linux - форева! :)


2-1351190824
Signal
2012-10-25 22:47
2013.05.19
Как изменить размер изображения TBitmap


15-1358195403
Юрий
2013-01-15 00:30
2013.05.19
С днем рождения ! 15 января 2013 вторник


4-1265111367
NewZ
2010-02-02 14:49
2013.05.19
Работа с памятью.


15-1357894023
boriskb
2013-01-11 12:47
2013.05.19
Говнокод.





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