Здравствуйте, гость ( Вход | Регистрация )
Iron Bug | Дата 21.12.2011, 12:18 |
а такой код, пронизанный try-catch - не зло ? )) Мне жутко нравится АПИ от mysql - никаких исключений, красота. Из конструктора иногда можно вернуть ошибку.Из циклов выйти можно, да. Раньше так делал даже. Но это всё некрасиво и признак того, что нужно писать подпрограмму вместо очередного вложенного цикла try-catch нужен только на самом верхнем уровне. а это ЗНАЧИТЕЛЬНО меньше кода и он гораздо надёжнее. правильно написанный код с исключениями гораздо лучше смотрится и его проще понять. подпрограммы тут никак не помогут. возвраты - только для очень мелких, не сильно вложенных программ. оправданием отказа от исключений может быть только использование в системе, которая их не поддерживает (каковых реально мало). |
|
Алексей1153 | Дата 21.12.2011, 11:41 |
а такой код, пронизанный try-catch - не зло ? )) Мне жутко нравится АПИ от mysql - никаких исключений, красота. Из конструктора иногда можно вернуть ошибку. Из циклов выйти можно, да. Раньше так делал даже. Но это всё некрасиво и признак того, что нужно писать подпрограмму вместо очередного вложенного цикла |
|
Iron Bug | Дата 21.12.2011, 8:03 |
исключения - зло А они там, в бусте, не отключаются ? отчего же - зло? при грамотном использовании вполне нормальное решение. когда у тебя куча вложенностей - проще всего кидать исключение и где-то на верхнем уровне, в одном месте, его обрабатывать, чем тащить через все процедуры коды ошибки. особенно если выходов из функции много. а в некоторых случаях (конструкторы) без исключений вообще нельзя сообщить об ошибке. в бусте исключения не отключаются. они отключаются опцией компилятора (GCC -fno-exceptions, MSVC - по-моему, просто нужно не указывать EH-опции). но не факт, что в таком варианте буст вообще будет как-либо работать. либо можно покопаться в стандартных библиотеках, если перехватить точку входа в обработчик и заменить на свою. но в разных компиляторах они разные. по стандарту в ABI они обзываются Personality Routine. для GCC определение выглядит так: #define PERSONALITY_FUNCTION __gxx_personality_v0 причём в GCC есть"быстрая" обработка исключений Drarf-2, а есть SJLJ(set jump-long jump), которая в сто раз более тормозная и нужна только для совместимости с системными библиотеками под вендой. а в MSVC SJLJ, без вариантов. но один хрен там компилятор не пересобрать |
|
Алексей1153 | Дата 21.12.2011, 6:28 |
исключения - зло А они там, в бусте, не отключаются ? | |
Bordes | Дата 20.12.2011, 23:31 |
О! Кажется рабочий вариант нашелся: надо в обработчике исключения вызвать для итератора no_push(), после чего при инкременте итератор не пытается "погрузиться" в проблемный каталог.
ЗЫ: Чтой-то пока не готов патчить boost. Тут бы по верхам хоть разобраться |
|
Iron Bug | Дата 20.12.2011, 20:25 |
причем, вроде как такое исключение выбрасывается даже в no-throw version of recursive_directory_iterator.... (в которой параметр в конструкторе задается) ну, как вариант - просто поправить сорцы, как тебе надо. я иногда свои патчи к бусту пишу, если что-то очень нужно |
|
Bordes | Дата 20.12.2011, 19:45 |
а если без доступа к содержимому делать инкремент - тоже выбрасывается или шагает ? (буста нету, проверить не могу) выбрасывается похоже, это бага буста: https://svn.boost.org/trac/boost/ticket/4494 впрочем, там что-то написано про передачу параметра конструктору итератора, но я не углублялась. не факт, что эта фича есть у старого буста. да, похоже, что бага... и что не закрытая причем, вроде как такое исключение выбрасывается даже в no-throw version of recursive_directory_iterator.... (в которой параметр в конструкторе задается) |
|
Iron Bug | Дата 20.12.2011, 12:19 |
похоже, это бага буста: https://svn.boost.org/trac/boost/ticket/4494 впрочем, там что-то написано про передачу параметра конструктору итератора, но я не углублялась. не факт, что эта фича есть у старого буста. |
|
Алексей1153 | Дата 20.12.2011, 11:57 |
а если без доступа к содержимому делать инкремент - тоже выбрасывается или шагает ? (буста нету, проверить не могу) | |
Bordes | Дата 20.12.2011, 9:04 |
Спасибо за ответ, но ничего не получилось - при возврате в цикл итератор все еще указывает на проблемную директорию и при операции инкремента (именно при инкременте) снова выбрасывается исключение - происходит зацикливание, т.к. итератор не может сдвинуться дальше.... |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 29.4.2024, 1:40 |