crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Работа с recursive_directory_iterator
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Iron Bug Дата 21.12.2011, 12:18
 
Цитата(Алексей1153 @ 21.12.2011, 14:41) *
а такой код, пронизанный try-catch - не зло ? )) Мне жутко нравится АПИ от mysql - никаких исключений, красота. Из конструктора иногда можно вернуть ошибку.Из циклов выйти можно, да. Раньше так делал даже. Но это всё некрасиво и признак того, что нужно писать подпрограмму вместо очередного вложенного цикла

try-catch нужен только на самом верхнем уровне. а это ЗНАЧИТЕЛЬНО меньше кода и он гораздо надёжнее.
правильно написанный код с исключениями гораздо лучше смотрится и его проще понять. подпрограммы тут никак не помогут. возвраты - только для очень мелких, не сильно вложенных программ. оправданием отказа от исключений может быть только использование в системе, которая их не поддерживает (каковых реально мало).
Алексей1153 Дата 21.12.2011, 11:41
  а такой код, пронизанный try-catch - не зло ? )) Мне жутко нравится АПИ от mysql - никаких исключений, красота.

Из конструктора иногда можно вернуть ошибку.

Из циклов выйти можно, да. Раньше так делал даже. Но это всё некрасиво и признак того, что нужно писать подпрограмму вместо очередного вложенного цикла
Iron Bug Дата 21.12.2011, 8:03
 
Цитата(Алексей1153 @ 21.12.2011, 9:28) *
исключения - зло А они там, в бусте, не отключаются ?

отчего же - зло? при грамотном использовании вполне нормальное решение. когда у тебя куча вложенностей - проще всего кидать исключение и где-то на верхнем уровне, в одном месте, его обрабатывать, чем тащить через все процедуры коды ошибки. особенно если выходов из функции много. а в некоторых случаях (конструкторы) без исключений вообще нельзя сообщить об ошибке.

в бусте исключения не отключаются. они отключаются опцией компилятора (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(), после чего при инкременте итератор не пытается "погрузиться" в проблемный каталог.
 try
  {
    wrecursive_directory_iterator i( p ), end;
  
    while ( i != end )
    {
      try
      {
        wcout << *i << std::endl;
        i++;
      }
      catch (const filesystem_error& ex)
      {
        wcout << ex.what() << '\n';
        i.no_push(); 
        i++; // пропускаем проблемную директорию
      }
    }
  }
  catch (const filesystem_error& ex)
  {
    wcout << ex.what() << L" Bad initial directiry\n";
  }


ЗЫ: Чтой-то пока не готов патчить boost. Тут бы по верхам хоть разобраться :rolleyes:
Iron Bug Дата 20.12.2011, 20:25
 
Цитата(Bordes @ 20.12.2011, 22:45) *
причем, вроде как такое исключение выбрасывается даже в no-throw version of recursive_directory_iterator....
(в которой параметр в конструкторе задается)

ну, как вариант - просто поправить сорцы, как тебе надо. я иногда свои патчи к бусту пишу, если что-то очень нужно :)
Bordes Дата 20.12.2011, 19:45
 
Цитата(Алексей1153 @ 20.12.2011, 11:57) *
а если без доступа к содержимому делать инкремент - тоже выбрасывается или шагает ? (буста нету, проверить не могу)

выбрасывается :(

Цитата(Iron Bug @ 20.12.2011, 12:19) *
похоже, это бага буста:
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
  Спасибо за ответ,
но ничего не получилось -
при возврате в цикл итератор все еще указывает на проблемную директорию и при операции инкремента (именно при инкременте) снова выбрасывается исключение - происходит зацикливание, т.к. итератор не может сдвинуться дальше....
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 7.7.2025, 8:59