Форум: "Прочее";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];
ВнизТем, кто утверждает, что тело except не должно быть пустым Найти похожие ветки
← →
Sergey Masloff (2009-01-17 12:05) [80]oxffff © (17.01.09 11:59) [77]
Я все понял. Программа не работает но внешне все хорошо. Повторяю спасибо, мне слышать больше ни о чем не надо.
← →
oxffff © (2009-01-17 12:13) [81]
> Sergey Masloff (17.01.09 12:05) [80]
Ты внимательно смотрел код?
Это код кода отдельного потока, который запускает неизвестное ему задание, и логирует неизвестно куда.
← →
oxffff © (2009-01-17 12:36) [82]
> Повторяю спасибо, мне слышать больше ни о чем не надо.
Мне жаль что ты совершенно не внимательно прочитал мои посты.
Вот упрощенный код общего запуска и логирования.
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;
← →
test (2009-01-17 12:44) [83]oxffff © (17.01.09 12:36) [82]
Что будет если Log.Inform("Task Start"); свалиться в ошибку, а потом Task.TryToCloseTask;. Память бесконечно, как и процессорное время?
← →
oxffff © (2009-01-17 12:53) [84]
> test (17.01.09 12:44) [83]
> oxffff © (17.01.09 12:36) [82]
> Что будет если Log.Inform("Task Start"); свалиться в ошибку,
> а потом Task.TryToCloseTask;. Память бесконечно, как и
> процессорное время?
Этот вопрос нужно не мне задавать, а тому кто будет писать Log и Task.
В этом коде не видно, однако и Log и Task будут разрушены тоже безопасностно.
Задача это кода гарантровать работостопосбность центрального приложения, которое запускает неизвестное задание и пишет в неизвестный лог.
Что касается возможных потерь внутри кода Log и Task - это вопросы к его разработчику.
← →
Игорь Шевченко © (2009-01-17 13:10) [85]test (17.01.09 08:40) [72]
> Не обязательно вылетать, часть ошибок можно обработать.
Есть два вида ошибок - ошибки из-за неверных данных и ошибки алгоритма.
Первые надо обрабатывать (возможно), о вторых надо как можно громче сообщать.
То есть, для примера, если кто-то ввел вместо 11234 112ЗЧ то это стоит обработать и позволить ввести верное значение.
А если в результате действий программиста произошло обращение к неинициализированному указателю, то стоит вылететь с максимально громким треском.
← →
Anatoly Podgoretsky © (2009-01-17 13:25) [86]> Sergey Masloff (17.01.2009 11:53:16) [76]
Намекаешь на http://www.podgoretsky.com/OtherParts/DM/BadWill.aspx пукт 4?
← →
oxffff © (2009-01-17 13:40) [87]
> Anatoly Podgoretsky © (17.01.09 13:25) [86]
> > Sergey Masloff (17.01.2009 11:53:16) [76]
>
> Намекаешь на http://www.podgoretsky.com/OtherParts/DM/BadWill.
> aspx пукт 4?
Есть глубокая уверенность, что и вы тоже не внимательно прочитали мои посты.
Специально для Вас:
Если нет 100% уверенности, что внешний код не может генерировать исключение(ввиду ошибки его автора и природа этих ошибок не известна),
то необходимо создавать максимально robust центральное приложение устойчивое к такого рода воздействиям.
Если рассуждать по вашему.
То есть например плагин 3D max, который сгенерировал неизвестное исключение, что теперь вся среда должна киркнуться? Так по вашему?
P.S. Я предлагаю добавить еще один пункт в ваши вредные заветы первым.
Оказание вредных советов без понимания сути.
Наказание: на кол.
← →
oxffff © (2009-01-17 13:43) [88]> Anatoly Podgoretsky © (17.01.09 13:25) [86]
> > Sergey Masloff (17.01.2009 11:53:16) [76]
Есть зоны ответственности за исключение.
← →
oxffff © (2009-01-17 13:47) [89]
> oxffff © (17.01.09 13:43) [88]
> > Anatoly Podgoretsky © (17.01.09 13:25) [86]
> > > Sergey Masloff (17.01.2009 11:53:16) [76]
>
> Есть зоны ответственности за исключение.
А это означает, что на определенных уровнях все неизвестные исключения должны "проглатываться", чтобы не нарушить функциональность вызывающей части.
← →
Anatoly Podgoretsky © (2009-01-17 13:51) [90]> oxffff (17.01.2009 13:40:27) [87]
Создание robust приложений и пустые except end - как бы не связаны или наоборот.
← →
Anatoly Podgoretsky © (2009-01-17 13:53) [91]> oxffff (17.01.2009 13:47:29) [89]
Ну и как это связано с пустой/не пустой try except. По твоим словам вытекает, что только пустой проглотит, а не пустой нет. Даже вывод диалога в try except не влияет на это, отлично проглатывается. Эти критерии не подходят, найди что ни будь другое.
← →
oxffff © (2009-01-17 13:56) [92]
> Anatoly Podgoretsky © (17.01.09 13:51) [90]
Не внимательно читали?
Если нет 100% уверенности, что внешний код не может генерировать исключение(ввиду ошибки его автора и природа этих ошибок не известна),
то необходимо создавать максимально robust центральное приложение устойчивое к такого рода воздействиям.
Поэтому есть [88] с пояснением [89].
Я жду ваш ответ про плагины к средам.
← →
oxffff © (2009-01-17 14:04) [93]
> Anatoly Podgoretsky © (17.01.09 13:53) [91]
> > oxffff (17.01.2009 13:47:29) [89]
>
> Ну и как это связано с пустой/не пустой try except. По твоим
> словам вытекает, что только пустой проглотит, а не пустой
> нет. Даже вывод диалога в try except не влияет на это, отлично
> проглатывается. Эти критерии не подходят, найди что ни будь
> другое.
Покажите мне код, который обрабатывает неизвестное исключение.
Рассмотрим пример [82]. Есть необходимость запускать что-то и логировать куда-то. И там и там есть потенциальное уязвимое место.
Поэтому есть зона ответственности по приоритетам.
1. логика центрального приложения
2. Логика запуска внешнего задания
3. Логика логирования.
Если мы не защитим 3, мы нарушим 2. что недопустимо.
Поэтому
try
Log.Inform("Task Start");
except
end;
Ошибка логирования не должна не позволить запустить задание.
Если мы не защитим 2, мы нарушим 1, что недопустимо.
Если мы пропустим за
except
end;
end;
Мы нарушим логику центрального приложения.
← →
Anatoly Podgoretsky © (2009-01-17 14:10) [94]
> Покажите мне код, который обрабатывает неизвестное исключение.except
on E: Exception do ErrorDialog(E.Message, E.HelpContext);
end;
← →
oxffff © (2009-01-17 14:22) [95]
> Anatoly Podgoretsky © (17.01.09 14:10) [94]
>
> > Покажите мне код, который обрабатывает неизвестное исключение.
>
>
> except
> on E: Exception do ErrorDialog(E.Message, E.HelpContext);
>
> end;
Этот диалог никто не увидит.
Я еще раз повторяю, что любое информирование для пользователя ведется через ILOG задачи. Если он сбойнул, мы должны защититься.
+дополнительный вопрос.
А где гарантии что ErrorDialog сам не вызовет исключение, нарушив логику?
Давайте я поясню работу этого приложения.
Есть центральное приложение, которое отслеживает изменения в файловой системе. На определенные фильтры изменений настроен запуск задачи с ее логированием. И задача и логирование предоставлется плагином DLL.
Пришли определенные файлики из SAP R3 запускается задачи с логированием в потоке - закачка данных в Oracle, MSSQL, foxpro, Аcesss.
← →
oxffff © (2009-01-17 14:22) [96]
> Anatoly Podgoretsky © (17.01.09 14:10) [94]
Где ответ на
>Я жду ваш ответ про плагины к средам.
← →
Anatoly Podgoretsky © (2009-01-17 15:20) [97]> oxffff (17.01.2009 14:22:35) [95]
Не уходи от темы, тебе нужна была обработка любого, заранее неизвестного исключения, теперь ты придераешься к форме.
Не нравится ErrorDialog замени на ErrorLog или на что хочешь, на твое любимое.
← →
Юрий Зотов © (2009-01-17 15:35) [98]"если в программе ошибка, то пусть она вылетает с максимально громким треском" (с) [70]
Конечно, здесь Игорь имел в виду ошибку программы, а не юзера.
И этим все сказано. Других аргументов не требуется. А если кто в этом сомневается, то перестанет сомневаться как только ему "дадут на сопровождение прогу которая писалась 5 лет назад с пустыми исключениями" (с) [72].
Молчаливое гашение ошибок программы - ОЧЕНЬ дурной стиль. Возможно, что действительно (хотя и крайне редко) встречаются ситуации, когда на это все же приходится идти, но в каждом конкретном случае обязательно нужно проанализировать, почему такая ситуация возникла и приложить максимум усилий для того, чтобы ее избежать. Вплоть до перепроектирования кода.
И это вовсе никакая не догма, а суровая правда жизни. Если прыгнуть с 20-го этажа, то разобьешься (хотя мизерный шанс все же есть). Все об этом знают и не прыгают. И догмой не называют.
Но спор бессмысленен. Потому что это спор тех, кто уже успел понабивать шишек с теми, кто еще понабивал их недостаточно. И пока не понабивают достаточно, все равно не поймут.
← →
Игорь Шевченко © (2009-01-17 15:48) [99]Юрий Зотов © (17.01.09 15:35) [98]
Я в [85] раскрыл тему :)
← →
vuk © (2009-01-17 16:17) [100]Ок. Вываливаться с треском. Ситуация. При форматировании сообщения и EventLog получилось так, что приложение, добавившее запись, свалило туда полную ахинею и при форматировании вылетает Access Violation. Что делать-то, вываливаться с криками "Нас обманули!" или таки удушить этот AV и продолжить разбор записи из лога дальше?
← →
Anatoly Podgoretsky © (2009-01-17 16:37) [101]> vuk (17.01.2009 16:17:40) [100]
Сообщить об этом, а не в тихаря, делать вид, что все хорошо прекрасная маркиза.
← →
Кто б сомневался © (2009-01-17 16:38) [102]
> Молчаливое гашение ошибок программы - ОЧЕНЬ дурной стиль.
Я часто создаю собственные Exception и перехватываю их в других местах программы. Да я гашу их, - т.е. не показывают юзеру - а юзеру это и не надо. Можно возвращать ошибку через функцию, но удобнее через exception. Кто сказал что так делать нельзя?
← →
Кто б сомневался © (2009-01-17 16:39) [103]
> Кто сказал что так делать нельзя?
Как раз наоборот.
← →
vuk © (2009-01-17 16:42) [104]to Anatoly Podgoretsky © (17.01.09 16:37) [101]:
>Сообщить об этом, а не в тихаря, делать вид, что все хорошо прекрасная
>маркиза.
Кому нужно это сообщение, если интересует, что находится в логе, а не накосячило ли приложение при записи туда.
Кстати. Кто-нибудь когда-нибудь наблюдал, что делают системные утилиты при разборе логов? Они именно пропускают ошибочные части сообщений и продолжают разбор. И никому ничего лишнего не сообщают.
← →
Игорь Шевченко © (2009-01-17 16:52) [105]vuk © (17.01.09 16:42) [104]
> Они именно пропускают ошибочные части сообщений и продолжают
> разбор. И никому ничего лишнего не сообщают.
Сообщают. Как минимум, о том, что не смогли разобрать.
← →
Юрий Зотов © (2009-01-17 16:57) [106]> vuk ©
1. Это ошибка данных, а речь шла об ошибках программы.
2. Что делать - зависит от того, какая это программа. Если ошибки в логе критичны, то надо вываливаться с треском. Иначе, если программа интерактивная, то можно где-нибудь (например, в статусбаре) уведомить юзера, что лог будет показан не весь и продолжать его разбор. Если же программа неинтерактивная, то аналогичное уведомление она может, например, записать в свой собственный лог и тоже продолжить разбор. И т.д.
3. Системные утилиты - штука хорошая, но их тоже пишут люди.
> Кто б сомневался © (17.01.09 16:38) [102]
> Кто сказал что так делать нельзя?
Никто не говорил. И Вы не гасите ошибки, а обрабатываете их. Так делать не только можно, но и нужно (когда это возможно, конечно).
← →
vuk © (2009-01-17 17:01) [107]to Игорь Шевченко © (17.01.09 16:52) [105]:
>Сообщают. Как минимум, о том, что не смогли разобрать.
Это, обычно, если сообщение целиком не смогли достать. В некоторых случаях ты можно пронаблюдать в тексте сообщения сроки вида %123. То есть не смогли достать и оставили как было. И сообщений об ошибке там не будет.
← →
oxffff © (2009-01-17 17:06) [108]
> 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]?
Да и ответьте на вопрос, что должна делать среда, если в одном из ее плагинов произошло исключение, пропускать ее дальше, если она не знает его природу(т.е. чтобы приложение рухнуло) и все таки гасить при переходе в другую зону ответственности.
Вы боитесь отвечать на этот вопрос?
← →
vuk © (2009-01-17 17:10) [109]to Юрий Зотов © (17.01.09 16:57) [106]:
>Это ошибка данных, а речь шла об ошибках программы.
Юр, это ошибка чужих данных, результат которой приводит к AV в моей программе, но заствить другую софтину писать в лог правильно я не могу. Могу только обработать возникающие ошибки (иногда задавив исключения). При этом запись из лога должна быть показана настолько, насколько удалось вытянуть информацию.
>Иначе, если программа интерактивная, то можно где-нибудь (например, в
>статусбаре) уведомить юзера, что лог будет показан не весь и продолжать
>его разбор.
В том-то и дело, что лог должен показываться весь. А то, что сообщение не смогли отформатировать, это иногда вставляется в сообщение, иногда нет и в этом случае часть сообщения, которую не удалось достать, остается без изменений .
← →
Anatoly Podgoretsky © (2009-01-17 17:12) [110]> vuk (17.01.2009 16:42:44) [104]
Так тож логи, задача строго протиположная. Но можно и сообщить, в виде строчки, что часть лога повреждена, но там и блок особо не нужен.
← →
oxffff © (2009-01-17 17:14) [111]Юрий Зотов © (17.01.09 16:57) [106]
Игорь Шевченко © (17.01.09 16:52) [105]
Уважаемые, ответьте мне на вопрос [108] последний абзац.
Только не забывайте в моем случае сама операция логирования внешняя ILOG, и нет никакого внутреннего логирования.
Что делать, если при логировании возникло исключение, и программа работает в фоновом режиме(нет GUI).
Пользователь видит все операции только через ILOG(внешний).
Заранее благодарен.
А то вы предлагаете пропустить это исключение дальше, нарушив просто все, завалив среду и все другие задания. Как вы говорите с треском.
← →
Юрий Зотов © (2009-01-17 17:15) [112]> vuk © (17.01.09 17:10) [109]
> лог должен показываться весь.
Так и покажи его весь. В каком виде сможешь, в таком и покажи. Но нужно каким-то образом уведомить юзера о том, что в логе есть ошибки. Это и будет нормальной обработкой исключений, а не их молчаливым гашением.
← →
oxffff © (2009-01-17 17:16) [113]
> vuk © (17.01.09 17:10) [109]
> to Юрий Зотов © (17.01.09 16:57) [106]:
> >Это ошибка данных, а речь шла об ошибках программы.
> Юр, это ошибка чужих данных, результат которой приводит
> к AV в моей программе, но заствить другую софтину писать
> в лог правильно я не могу. Могу только обработать возникающие
> ошибки (иногда задавив исключения). При этом запись из лога
> должна быть показана настолько, насколько удалось вытянуть
> информацию.
Они этого не понимают или не видят.
Я уже 3 страницы пытаюсь объяснить нашим уважаемым,
но что пока не получается.
← →
oxffff © (2009-01-17 17:17) [114]
> Но нужно каким-то образом уведомить юзера о том, что в логе
> есть ошибки.
Опять за свое. Нет никакого внутреннего логирования.
← →
Юрий Зотов © (2009-01-17 17:19) [115]> oxffff © (17.01.09 17:14) [111]
> Что делать, если при логировании возникло исключение, и программа
> работает в фоновом режиме(нет GUI).
Зависит от того, что это за программа и что она делает. Если вываливаться нельзя, то, возможно, о внутреннем логировании как раз и стоит подумать.
Но не делать вид, что все хорошо, когда не все хорошо.
← →
Anatoly Podgoretsky © (2009-01-17 17:24) [116]> oxffff (17.01.2009 17:14:51) [111]
Ну пошли письмо.
← →
Юрий Зотов © (2009-01-17 17:25) [117]> oxffff
1. Сдержанность и вежливость - достоинства, а не пороки.
2. Есть одно хорошее правило - критикуй не оппонента, а его точку зрения.
3. Подумайте о том, что и Вам тоже пытаются объяснить, тоже на 3-х страницах и тоже не получается.
← →
vuk © (2009-01-17 17:37) [118]Юр, не надо меня агитировать за обработчики исключений. Я их сам всегда пишу. И этот случай с логом - чуть ли не единственный (других вообще не помню), когда я исключения удавил. Там просто алгоритм такой был, что при возникновении ошибок функция должна была вернуть пустую строку, ну так она была в Result прописана с самого начала и исключение можно было давить.
На самом деле меня больше убивает то, что многие так пишут, будто ошибок вообще не может быть. Автор FastReport-а этим отличался. Не знаю как сейчас, может и исправился, но раньше водилось за ним такое.
← →
Игорь Шевченко © (2009-01-17 18:13) [119]oxffff © (17.01.09 17:14) [111]
Скрипач, ты что, дальтоник ? Зеленый от оранжевого отличить не можешь ?
← →
Anatoly Podgoretsky © (2009-01-17 18:44) [120]> oxffff (17.01.2009 17:16:53) [113]
А та продолжай, доводы пока не убедительны.
Страницы: 1 2 3 4 5 6 вся ветка
Форум: "Прочее";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];
Память: 0.71 MB
Время: 0.305 c