|
|
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
OFFTOPIC: На shell используя kill - trap можно реализовать механизм обработки ошибок, подобный обработке исключений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2007, 12:45 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
MasterZivНе, может быть можно и проигнорировать ошибку. Например, при сбое диска записать на другой. Ну дык этой сбой сначала нужно зафиксировать. Так что никакого игнорирования :). White OwlА наверх всегда уходит одна единственная ошибка: "плохой пакет". Следующий уровень уже решает повторить попытку посылки пакета или сообщить выше о потере связи Ну так в чем проблема? Ловим исключение и повторяем попытку. К вопросу исключения vs код возврата это уже не имеет отношение. Это во-первых. А во-вторых, принимая решение о том, кидать ли исключения или юзать код возврата, следует учитывать, насколько существеннен этот сбой для работы алгоритма. Если мы пишем текстовый редактор, и сохраняем файл на диск, нам все равно, что случилось с диском, главное - что запись невозможна. В этом случае следует кидать исключения. Если же мы пишем драйвер, то с его точки зрения сбой при записи - одна из возможных и ожидаемых ситуаций, и реакция на каждуй из них уже составляет часть реализуемого алгоритма. Поэтому в этом случае более естественно использовать код возврата. Собственно говоря, исключения и сущевтуют для того, чтобы упростить обработку ошибок по первому сценирию. Никто не говорит о том, что они должны полностью заменить коды возврата. White OwlГую надо обрабатывать только два типа ошибки - нет ошибки и обрыв связи. Почему же? Гую в праве обрабатывать любой тип ошибки, все зависит от поставленной задачи. Для этого и существует иерархия объектов исключений. Для приложений, ориентированных на "обыного" пользователя, ловим все подряд с помощью catch(exception&). Для специалистов, вводим более гранулярную обработку, с отдельным обработчиком на каждый тип. White OwlНо если ты сильно хочешь - можешь конечно сообщать гую о всех пакетах с неверной контрольной суммой или с потеряным хвостом Именно что сообщаем максимум инофрмации. Для самого пользователя или инженера техподдержки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2007, 14:12 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
blinded White OwlА представь что мы вызываем foo() из какой-нибудь чужой библиотеки, а потом однажды обновили эту самую чужую библиотеку и теперь foo() новой версии выдает больше (или вообще другие) ошибки чем в предыдущей версии. В варинте с enum в качестве кода возврата компилятор мне сразу накидает варнингов про все места где я использовал эту функцию, но не обновил работу с ней. Попробуй повторить это с исключениями. И не подумаю. У меня полнаяя сборка идет на Sun'e часа полтора (без тестов), потом еще неделю логи разбирать? Не могу себе позволить сие удовольствие. ээээ... А что, инкрементальную компиляцию уже отменили? Откуда неделя на разбор логов компилятора? make clean & make all И получаешь лог ошибок одного модуля. Исправил - make all получаешь ошибки другого модуля. А иначе тебе остается только надеятся на то, что там в библиотеке ничего серьезного не поменялось и она полностью совместима снизу-вверх. blinded White OwlНо все таки, может мне кто-нибудь элегантно решить задачку перехвата недокументированых исключений? Ну это примерно тоже что и поиск незадукоментированного кода возврата. В общем случае не решаемо, при наличии отладочной информации в модуле - с помощью отдачикаНеверно. В общем случае оно как раз решаемо. Я уже показывал как решается задача отлова недокументированого кода возврата, можно повторить синтаксис решения одни-в-один (обернуть каждую функцию в свой собственный try/catch блок) и точно так же ловить известные и неизвестные исключения, но это уже не будет работа в стиле исключений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2007, 17:08 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
Беда в том еще, что исключения нужно обрабатывать всегда. А код возврата - нет. Поэтому мы и встречаем каждый день злобные сообщения "Unhandled exception...." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2007, 12:30 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
вообще-то, если ошибка возникает и не обрабатывается – это ахтунг ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2007, 13:04 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
White Owl ээээ... А что, инкрементальную компиляцию уже отменили? Откуда неделя на разбор логов компилятора? make clean & make all И получаешь лог ошибок одного модуля. Исправил - make all получаешь ошибки другого модуля. А иначе тебе остается только надеятся на то, что там в библиотеке ничего серьезного не поменялось и она полностью совместима снизу-вверх. Нет конечно не отменили.Только это возможно в идеальном варианте. Когда изначально код доводился до блеска, а у меня чужого добра навалом, да и сам не святой. В такой ситуации на warning и не смотришь. Да и живем на нескольких компиляторах, что для одного в порядке вещей, для другого warning. Да и объем кода достаточно большой, а времени нет, все новые доработки требуют...:( blinded White OwlНо все таки, может мне кто-нибудь элегантно решить задачку перехвата недокументированых исключений? Ну это примерно тоже что и поиск незадукоментированного кода возврата. В общем случае не решаемо, при наличии отладочной информации в модуле - с помощью отдачикаНеверно. В общем случае оно как раз решаемо. Я уже показывал как решается задача отлова недокументированого кода возврата, можно повторить синтаксис решения одни-в-один (обернуть каждую функцию в свой собственный try/catch блок) и точно так же ловить известные и неизвестные исключения, но это уже не будет работа в стиле исключений.[/quot] Ну хорошо перехватили мы какое-то исключение, что с ним делать? Все равно программе предстоит падать, если исключение неизвестно мы не знаем тяжести его последствий и продолжать работу опасно... Теперь начинаем разборку 1) исключение сгенерировано кодом написаным нашей командой, ну тогда оно должно наследоваться от одного класса и содержать информацю для локализации места в котором его сгенерили. имя файла, строка кода. А кто сгенерирует что-то иное получит штраф к з/п 2) исключение сгенерировано сторонним кодом. Единственное что можно, если отнаследовано от std:exception попросить у него what() может чего и скажет и перейти к п 3 3) Смоделировать ситуацию и методом половинного деления найти причину. Отметим что вы по всей видимости имеете дело с открытым кодом, где проблему можно решить копанием в исходниках. У меняже ситуация хуже - используются коммерческие библиотеки. Все равно чтобы доказать неправоту автора придется делать тестовый пример... У нас уже набор всяческих тестов накопился. Приходит тебе новая версия, берешь и запускаешь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2007, 14:28 |
|
||
|
Исключения: за и против
|
|||
|---|---|---|---|
|
#18+
blindedа у меня чужого добра навалом, да и сам не святой. В такой ситуации на warning и не смотришь. Да и живем на нескольких компиляторах, что для одного в порядке вещей, для другого warning.Фи! А я иногда специально прогоняю код через несколько разных компиляторов чтобы увидеть все возможные варнинги и исправить их. Кстати, по моим наблюдениями гнусь самая тщательная с этой точки зрения :) blindedНу хорошо перехватили мы какое-то исключение, что с ним делать? Все равно программе предстоит падать, если исключение неизвестно мы не знаем тяжести его последствий и продолжать работу опасно...Да, но падать можно красиво, а можно с грохотом :) blinded2) исключение сгенерировано сторонним кодом. Единственное что можно, если отнаследовано от std:exception попросить у него what() может чего и скажет и перейти к п 3В том то и дело что "может чего и скажет". А если не скажет? Тогда копаться, копаться и копаться. А коды возврата локализованы по определению. Если поймал что-то - уже с самого начала видишь место где ошибка была и сразу переходишь к пункту три. blindedОтметим что вы по всей видимости имеете дело с открытым кодом, где проблему можно решить копанием в исходниках. У меняже ситуация хуже - используются коммерческие библиотеки. Все равно чтобы доказать неправоту автора придется делать тестовый пример...В данном случае это неважно. В любом случае чтобы доказать неправоту автора надо делать тестовый пример. В открытой библиотеке это чуть проще сделать, но не намного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2007, 17:19 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34384396&tid=2029270]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
8ms |
check topic access: |
8ms |
track hit: |
145ms |
get topic data: |
18ms |
get forum data: |
11ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 501ms |

| 0 / 0 |
