Всем привет!
Я тут новенький...по сему не надо сильно кидать камни в меня
Вопрос таков:
вот прочитал про механизм исключений в С#...и создаётся впечатление, что обработку этих самых исключений надо делать везде..ну или почти везде..
Поясните пжста (желательно на примере) в каких случаях нужна обработка исключений..а где нет (достаточно условного блока)..
С уважением.
Re: Когда стоит и не стоит использовать исключения?
Здравствуйте, falls_rain, Вы писали:
_>Всем привет! _>Я тут новенький...по сему не надо сильно кидать камни в меня _>Вопрос таков: _>вот прочитал про механизм исключений в С#...и создаётся впечатление, что обработку этих самых исключений надо делать везде..ну или почти везде.. _>Поясните пжста (желательно на примере) в каких случаях нужна обработка исключений..а где нет (достаточно условного блока).. _>С уважением.
Обрабатывать исключения надо там, где есть возможность сделать что-то полезное с ними. В большинстве случаев вся обрабтка checked исключений сводится к бросанию их на верхний уровень или выводу в лог, так что вообщем-то можно обойтись и unchecked. Иногда возникает необходимость освободить ресурс в случае исключения, например освободить соединение с базой. Не знаю как c С#, но некоторые java бибиотеки (Hibernate) избавляются от checked исключений, и я вообщем-то с этим согласен: исключение — это исключительная ситуация в приложении в большинстве случаев свидетельствующая о неправильной логике работы приложения.
Re: Когда стоит и не стоит использовать исключения?
Здравствуйте, falls_rain, Вы писали:
_>вот прочитал про механизм исключений в С#...и создаётся впечатление, что обработку этих самых исключений надо делать везде..ну или почти везде.. _>Поясните пжста (желательно на примере) в каких случаях нужна обработка исключений..а где нет (достаточно условного блока)..
Если важна скорость, то лучше делать условный блок. Исключение обрабатывается примерно в 1000 раз медленнее, чем оператор if.
Здравствуйте, Trean, Вы писали:
T>и я вообщем-то с этим согласен: исключение — это исключительная ситуация в приложении в большинстве случаев свидетельствующая о неправильной логике работы приложения.
А я вот не согласен с твоим утверждением. Возбуждение исключения должно свидетельствовать как раз об обратном -- о том, что произошла ситуация, предполагаемая логикой программы, но от оной не зависящая. То бишь, если у тебя в процессе передачи данных по сети пропала связь, это ведь ни в коем случае не баг в твоей программе. Однако предусмотреть такую ситуацию необходимо.
... << RSDN@Home 1.2.0 alpha rev. 619>>
--
К вашим услугам,
Re[3]: Когда стоит и не стоит использовать исключения?
Здравствуйте, Spaider, Вы писали:
S>Здравствуйте, Trean, Вы писали:
T>>и я вообщем-то с этим согласен: исключение — это исключительная ситуация в приложении в большинстве случаев свидетельствующая о неправильной логике работы приложения.
S>А я вот не согласен с твоим утверждением. Возбуждение исключения должно свидетельствовать как раз об обратном -- о том, что произошла ситуация, предполагаемая логикой программы, но от оной не зависящая. То бишь, если у тебя в процессе передачи данных по сети пропала связь, это ведь ни в коем случае не баг в твоей программе. Однако предусмотреть такую ситуацию необходимо.
Вы либо прочитали невнимательно, либо не совсем меня поняли. Потому что я с вами тоже согласен :) Я имел ввиду кидание исключений во внутренней логике не всегда правильно. При разрыве соединения, например, с базой, вы можете попытаться например его восстановить, или корректно освободить ресурс, попутно записав ошибку в лог. При разрыве связи по сети вы можете попробовать передать данные еще раз, или инициировать новое соединение на другой порт или еще что-то "полезное". А если у вас в коде выбросилось исключение вроде "деления на ноль", то что вы будете с ним делать? В ряде случаев у вас нет способов догадаться, что надо сделать, чтобы исправить ситуацию, какое значение у того или иного параметра переданного пользователем должно быть. Прог телепатов я еще не встречал :-) "Решение" в виде подстановки значения по умолчанию, это лишь попытка скрыть проблему в логике или исходных данных. Повторюсь, если вы ничего не можете обработать исключение, и лишь модете кинуть его на более высокий уровень или записать в лог, не используйте checked исключений. И не я один так думаю, я убедился в этом на своем опыте, checked исключения полезны в ограниченном количестве случаев.
Re[4]: Когда стоит и не стоит использовать исключения?
Здравствуйте, Trean, Вы писали:
T>Вы либо прочитали невнимательно, либо не совсем меня поняли. Потому что я с вами тоже согласен Я имел ввиду кидание исключений во внутренней логике не всегда правильно. При разрыве соединения, например, с базой, вы можете попытаться например его восстановить, или корректно освободить ресурс, попутно записав ошибку в лог. При разрыве связи по сети вы можете попробовать передать данные еще раз, или инициировать новое соединение на другой порт или еще что-то "полезное". А если у вас в коде выбросилось исключение вроде "деления на ноль", то что вы будете с ним делать? В ряде случаев у вас нет способов догадаться, что надо сделать, чтобы исправить ситуацию, какое значение у того или иного параметра переданного пользователем должно быть. Прог телепатов я еще не встречал "Решение" в виде подстановки значения по умолчанию, это лишь попытка скрыть проблему в логике или исходных данных. Повторюсь, если вы ничего не можете обработать исключение, и лишь модете кинуть его на более высокий уровень или записать в лог, не используйте checked исключений. И не я один так думаю, я убедился в этом на своем опыте, checked исключения полезны в ограниченном количестве случаев.
Не забывай еще, что в программе могут быть ошибки. Ошибки разработчика.
С ними-то тоже надо что-то делать (в перспективе исправлять, конечно).
Хорошо, если прога может продолжить корректно работать, даже несмотря на ошибки прогаммиста, а этого как раз можно добиться, изолируя ошибки на некотором уровне, а не падая с воплями, что что-то не правильно.
How are YOU doin'?
Re[5]: Когда стоит и не стоит использовать исключения?
Здравствуйте, MatFiz, Вы писали:
MF>Здравствуйте, Trean, Вы писали:
MF>Не забывай еще, что в программе могут быть ошибки. Ошибки разработчика. MF>С ними-то тоже надо что-то делать (в перспективе исправлять, конечно). MF>Хорошо, если прога может продолжить корректно работать, даже несмотря на ошибки прогаммиста, а этого как раз можно добиться, изолируя ошибки на некотором уровне, а не падая с воплями, что что-то не правильно.
сомнительна корректность такой работы: когда валятся ошибки программа работает некорректно, как бы глубоко вы их не пытались запрятать. Это очень похоже на прятание головы в песок. Представляете вы запускаете какую-то программу, пытаетесь что-то сделать, а она ничего не делает и не говорит почему. А все потому, что к примеру, разработчик обрабатывает эксепшены следующим образом:
catch(...) {
// do nothing
}
Хорошо, если что-то в лог пишется, и то поди догадайся, что в лог что-то записалось. Программа, то не говорит что ошибка произошла.
Бывает попадаются такие программы, кроме как удалить их другого желания не возникает.
Re: Когда стоит и не стоит использовать исключения?
Здравствуйте, Слава Шевцов, Вы писали:
СШ>Если важна скорость, то лучше делать условный блок. Исключение обрабатывается примерно в 1000 раз медленнее, чем оператор if.
Кому лучше? Это сработавшее исключение влияет на скорость, а catch сам по себе (без выполнившегося throw) ни на что не влияет.
Здравствуйте, Слава Шевцов, Вы писали:
СШ>Здравствуйте, falls_rain, Вы писали:
_>>вот прочитал про механизм исключений в С#...и создаётся впечатление, что обработку этих самых исключений надо делать везде..ну или почти везде.. _>>Поясните пжста (желательно на примере) в каких случаях нужна обработка исключений..а где нет (достаточно условного блока)..
СШ>Исключение обрабатывается примерно в 1000 раз медленнее, чем оператор if.
Это так, однако на то оно и исключение, чтобы кидаться именно в исключительных ситуациях.
Если это так, то наличие исключений не должно заметно влиять на производительность приложения.
Кроме того, в компиляторе поддержка исключений включена всегда, в противном случае мы не сможем получить предусмотренное стандартом поведение и уведомление об ошибках некотроых функций стандартной библиотеки (например, оператор new).
Об этом пишут Sutter и Alexandrescu в "C++ Coding Standards". Более того, они ратуют за использование исключения вместо кодов возрата потому как:
— Исключения невозможно проигнорировать
— Исключения распространяются автоматически, пока не будут перехвачены
— Исключения выносят обработку ошибок и восстановления после них из основного потока управления
— Исключения оказываются наилучшим способом уведомления об ошибках в конструкторах и операторах
-- Андрей
Re[3]: Когда стоит и не стоит использовать исключения?
Здравствуйте, Андрей Коростелев, Вы писали:
АК>Здравствуйте, Слава Шевцов, Вы писали:
СШ>>Здравствуйте, falls_rain, Вы писали:
_>>>вот прочитал про механизм исключений в С#...и создаётся впечатление, что обработку этих самых исключений надо делать везде..ну или почти везде.. _>>>Поясните пжста (желательно на примере) в каких случаях нужна обработка исключений..а где нет (достаточно условного блока)..
АК>Кроме того, в компиляторе поддержка исключений включена всегда, в противном случае мы не сможем получить предусмотренное стандартом поведение и уведомление об ошибках некотроых функций стандартной библиотеки (например, оператор new). АК>Об этом пишут Sutter и Alexandrescu в "C++ Coding Standards".
Мне кажется, что рекомендации Sutter'а и Alexandrescu врядли стоит давать человеку, собирающемуся писать на C#. Несмотря на то, что, может быть, в данном случае они и правильны.
--
Дмитро
Re[2]: Когда стоит и не стоит использовать исключения?
Здравствуйте, Trean, Вы писали:
<skipped> T>Иногда возникает необходимость освободить ресурс в случае исключения, например освободить соединение с базой.
Обычно это делается через "захват ресурса — есть инициализация объекта". И данный код сам освобождает данный ресурс
Re: Когда стоит и не стоит использовать исключения?
Здравствуйте, falls_rain, Вы писали:
_>Поясните пжста (желательно на примере) в каких случаях нужна обработка исключений..а где нет (достаточно условного блока)..