-
Ок. Вываливаться с треском. Ситуация. При форматировании сообщения и EventLog получилось так, что приложение, добавившее запись, свалило туда полную ахинею и при форматировании вылетает Access Violation. Что делать-то, вываливаться с криками "Нас обманули!" или таки удушить этот AV и продолжить разбор записи из лога дальше?
-
> vuk (17.01.2009 16:17:40) [100]
Сообщить об этом, а не в тихаря, делать вид, что все хорошо прекрасная маркиза.
-
> Молчаливое гашение ошибок программы - ОЧЕНЬ дурной стиль.
Я часто создаю собственные Exception и перехватываю их в других местах программы. Да я гашу их, - т.е. не показывают юзеру - а юзеру это и не надо. Можно возвращать ошибку через функцию, но удобнее через exception. Кто сказал что так делать нельзя?
-
> Кто сказал что так делать нельзя?
Как раз наоборот.
-
to Anatoly Podgoretsky © (17.01.09 16:37) [101]: >Сообщить об этом, а не в тихаря, делать вид, что все хорошо прекрасная >маркиза. Кому нужно это сообщение, если интересует, что находится в логе, а не накосячило ли приложение при записи туда.
Кстати. Кто-нибудь когда-нибудь наблюдал, что делают системные утилиты при разборе логов? Они именно пропускают ошибочные части сообщений и продолжают разбор. И никому ничего лишнего не сообщают.
-
vuk © (17.01.09 16:42) [104]
> Они именно пропускают ошибочные части сообщений и продолжают > разбор. И никому ничего лишнего не сообщают.
Сообщают. Как минимум, о том, что не смогли разобрать.
-
> vuk ©
1. Это ошибка данных, а речь шла об ошибках программы.
2. Что делать - зависит от того, какая это программа. Если ошибки в логе критичны, то надо вываливаться с треском. Иначе, если программа интерактивная, то можно где-нибудь (например, в статусбаре) уведомить юзера, что лог будет показан не весь и продолжать его разбор. Если же программа неинтерактивная, то аналогичное уведомление она может, например, записать в свой собственный лог и тоже продолжить разбор. И т.д.
3. Системные утилиты - штука хорошая, но их тоже пишут люди.
> Кто б сомневался © (17.01.09 16:38) [102] > Кто сказал что так делать нельзя?
Никто не говорил. И Вы не гасите ошибки, а обрабатываете их. Так делать не только можно, но и нужно (когда это возможно, конечно).
-
to Игорь Шевченко © (17.01.09 16:52) [105]: >Сообщают. Как минимум, о том, что не смогли разобрать. Это, обычно, если сообщение целиком не смогли достать. В некоторых случаях ты можно пронаблюдать в тексте сообщения сроки вида %123. То есть не смогли достать и оставили как было. И сообщений об ошибке там не будет.
-
> Anatoly Podgoretsky © (17.01.09 15:20) [97] > > oxffff (17.01.2009 14:22:35) [95] > > Не уходи от темы, тебе нужна была обработка любого, заранее > неизвестного исключения, теперь ты придераешься к форме. > > Не нравится ErrorDialog замени на ErrorLog или на что хочешь, > на твое любимое.
Вы не внимательно читаете. Логирование задания происходит через контракт с внешней реализацией. Логирование идет через ILOG. У меня нет внутреннего логирования. Мне не нужен ErrorDialog, у меня эта ситуация обрабатывается в
procedure DoTask(const Task:ITask;const Log:ILog); begin try Log.Inform('Task Start'); except end; try try Task.Start; except try Task.TryToCloseTask; except end; Log.Inform('Task Error'); raise; end;
try Log.Inform('Task End'); except end; except end; end;
Вы мне пытаетесь втюхать внутренее логирование программы,его нет. я вам в четвертый раз повторяю. Что логирование через внешнюю реализацию-интрефейс. А если так, то значит если возникло исключение при выполнении задания, то мы вызываем логирование, а поскольку оно внешее(ну нет реализации внутреннего логирования), то в нем может произойти исключение(нет места, обрыв соединения и т.д., отказ от... т.е. совершенно произвольное исключение, которое еще объявлено во внешней программе). Поэтому само логирование тоже нужно защитить пустым except end;
Я надеюсь теперь вам понятно или опять как в [14] и [15]?
Да и ответьте на вопрос, что должна делать среда, если в одном из ее плагинов произошло исключение, пропускать ее дальше, если она не знает его природу(т.е. чтобы приложение рухнуло) и все таки гасить при переходе в другую зону ответственности. Вы боитесь отвечать на этот вопрос?
-
to Юрий Зотов © (17.01.09 16:57) [106]: >Это ошибка данных, а речь шла об ошибках программы. Юр, это ошибка чужих данных, результат которой приводит к AV в моей программе, но заствить другую софтину писать в лог правильно я не могу. Могу только обработать возникающие ошибки (иногда задавив исключения). При этом запись из лога должна быть показана настолько, насколько удалось вытянуть информацию.
>Иначе, если программа интерактивная, то можно где-нибудь (например, в >статусбаре) уведомить юзера, что лог будет показан не весь и продолжать >его разбор. В том-то и дело, что лог должен показываться весь. А то, что сообщение не смогли отформатировать, это иногда вставляется в сообщение, иногда нет и в этом случае часть сообщения, которую не удалось достать, остается без изменений .
-
> vuk (17.01.2009 16:42:44) [104]
Так тож логи, задача строго протиположная. Но можно и сообщить, в виде строчки, что часть лога повреждена, но там и блок особо не нужен.
-
Юрий Зотов © (17.01.09 16:57) [106] Игорь Шевченко © (17.01.09 16:52) [105]
Уважаемые, ответьте мне на вопрос [108] последний абзац. Только не забывайте в моем случае сама операция логирования внешняя ILOG, и нет никакого внутреннего логирования. Что делать, если при логировании возникло исключение, и программа работает в фоновом режиме(нет GUI). Пользователь видит все операции только через ILOG(внешний). Заранее благодарен.
А то вы предлагаете пропустить это исключение дальше, нарушив просто все, завалив среду и все другие задания. Как вы говорите с треском.
-
> vuk © (17.01.09 17:10) [109] > лог должен показываться весь.
Так и покажи его весь. В каком виде сможешь, в таком и покажи. Но нужно каким-то образом уведомить юзера о том, что в логе есть ошибки. Это и будет нормальной обработкой исключений, а не их молчаливым гашением.
-
> vuk © (17.01.09 17:10) [109] > to Юрий Зотов © (17.01.09 16:57) [106]: > >Это ошибка данных, а речь шла об ошибках программы. > Юр, это ошибка чужих данных, результат которой приводит > к AV в моей программе, но заствить другую софтину писать > в лог правильно я не могу. Могу только обработать возникающие > ошибки (иногда задавив исключения). При этом запись из лога > должна быть показана настолько, насколько удалось вытянуть > информацию.
Они этого не понимают или не видят. Я уже 3 страницы пытаюсь объяснить нашим уважаемым, но что пока не получается.
-
> Но нужно каким-то образом уведомить юзера о том, что в логе > есть ошибки.
Опять за свое. Нет никакого внутреннего логирования.
-
> oxffff © (17.01.09 17:14) [111]
> Что делать, если при логировании возникло исключение, и программа > работает в фоновом режиме(нет GUI).
Зависит от того, что это за программа и что она делает. Если вываливаться нельзя, то, возможно, о внутреннем логировании как раз и стоит подумать.
Но не делать вид, что все хорошо, когда не все хорошо.
-
> oxffff (17.01.2009 17:14:51) [111]
Ну пошли письмо.
-
> oxffff
1. Сдержанность и вежливость - достоинства, а не пороки.
2. Есть одно хорошее правило - критикуй не оппонента, а его точку зрения.
3. Подумайте о том, что и Вам тоже пытаются объяснить, тоже на 3-х страницах и тоже не получается.
-
Юр, не надо меня агитировать за обработчики исключений. Я их сам всегда пишу. И этот случай с логом - чуть ли не единственный (других вообще не помню), когда я исключения удавил. Там просто алгоритм такой был, что при возникновении ошибок функция должна была вернуть пустую строку, ну так она была в Result прописана с самого начала и исключение можно было давить.
На самом деле меня больше убивает то, что многие так пишут, будто ошибок вообще не может быть. Автор FastReport-а этим отличался. Не знаю как сейчас, может и исправился, но раньше водилось за ним такое.
-
oxffff © (17.01.09 17:14) [111]
Скрипач, ты что, дальтоник ? Зеленый от оранжевого отличить не можешь ?
|