Форум программистов, компьютерный форум CyberForum.ru

Исключения потоков - C++

Восстановить пароль Регистрация
 
akk
 Аватар для akk
44 / 44 / 7
Регистрация: 28.01.2012
Сообщений: 341
27.05.2013, 19:53     Исключения потоков #1
У меня такой вопрос, как можно обработать исключение, если к примеру не получается открыть файл.
То есть я делаю так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    file.clear(); // очистить биты
    file.exceptions(ios_base::failbit);
    try
    {
        file.open(filename);
    }
    catch(ios_base::failure) 
    { 
        file.exceptions(ios_base::goodbit);
        cerr << "file not found\n";
        exit(-1);
 
    }
а нужно к примеру предложить ввести путь и название.
Т е
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    char filename[20]="myfile.txt";
file.clear(); // очистить биты
    file.exceptions(ios_base::failbit);
    try
    {
        file.open(filename);
    }
    catch(ios_base::failure) 
    { 
        file.exceptions(ios_base::goodbit);
 
        cout<<"Vvedite nazvanie faila"; cin>>filename;
       // file.open(filename);
 
    }
как с catch можно будет опять попасть в try?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2013, 19:53     Исключения потоков
Посмотрите здесь:

Исключения C++
исключения C++
исключения C++
Исключения C++
Исключения C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4846 / 2985 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
27.05.2013, 20:05     Исключения потоков #2
C++
1
2
3
4
5
6
7
8
9
10
11
    bool opened = false;
    ...
    do {
        try {
            ...
            opened = true;
        } catch ( ... ) {
            ...
        }
    } while ( !opened );
    ...
Tulosba
27.05.2013, 22:36
  #3

Не по теме:

lazybiz, можно было сразу бесконечный цикл замутить для надёжности

akk
 Аватар для akk
44 / 44 / 7
Регистрация: 28.01.2012
Сообщений: 341
27.05.2013, 23:18  [ТС]     Исключения потоков #4
Из-за чего может быть такая ошибка? terminate called after throwing an instance of 'std::ios_base::failure' whar() : basic_ios::clear

Добавлено через 2 минуты
И вообще как правильно обрабатывать исключения для файлов?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
28.05.2013, 21:22     Исключения потоков #5
Цитата Сообщение от akk Посмотреть сообщение
И вообще как правильно обрабатывать исключения для файлов?
Так же как и любые другие исключения. Ставите обработчик на нужный тип исключения и выполняете необходимые действия.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
28.05.2013, 21:27     Исключения потоков #6
А зачем вообще обрабатывать ошибки файловых потоков как исключения? Ведь не зря же по умолчанию те ошибки обрабатываются тихо-мирно, без исключений и прочих сильнодействующих средств.
akk
 Аватар для akk
44 / 44 / 7
Регистрация: 28.01.2012
Сообщений: 341
28.05.2013, 22:03  [ТС]     Исключения потоков #7
Tulosba, сейчас, почему-то появилась такая ошибка
Цитата Сообщение от akk Посмотреть сообщение
terminate called after throwing an instance of 'std::ios_base::failure' whar() : basic_ios::clear
убирается только если убрать исключения
C++
1
2
3
4
5
6
7
8
9
10
11
    flang.exceptions(ios_base::failbit);
    try
    {
 
        flang.open(filelangname);
    }
    catch( ios_base::failure f ) 
    { 
        cerr << "file not found"<< f.what() << endl;
        exit(-1);
    }
Добавлено через 35 минут
Если добавить после catch
C++
1
flang.exceptions(ios::goodbit);
то работает, можете объяснить почему?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
28.05.2013, 22:11     Исключения потоков #8
в 2008 студии код из первого поста работает. кидается то, что надо и так же ловится.
что у вас - неизвестно. у себя вы можете продебажить функцию open и посмотреть, что там происходит на самом деле.
akk
 Аватар для akk
44 / 44 / 7
Регистрация: 28.01.2012
Сообщений: 341
28.05.2013, 23:04  [ТС]     Исключения потоков #9
Цитата Сообщение от akk Посмотреть сообщение
то работает, можете объяснить почему?
Все разобрался! flang.exceptions(ios::goodbit); отменяет обработку исключения, а у меня получается в следующей функции
C++
1
2
3
4
for(int i=0; i<SIZE_F; i++)
    {
        flang.getline(string, BUF);
    }
то есть нужно читать файл на eof + ограничивать SIZE_F.
Цитата Сообщение от DU Посмотреть сообщение
у себя вы можете продебажить функцию
согласен нужно научится пользоваться дебагером. только я не пользуюсь пока MS VS. Компилирую с помощью g++ с консоли, слышал про GDB, но так и не понял как им пользоваться, есть кроме него другие отладчики, желательно с мануалом на русском?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2013, 00:05     Исключения потоков
Еще ссылки по теме:

C++ Исключения
C++ Исключения
C++ Создание и завершение процессов и потоков. Приоритеты выполнения потоков

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
29.05.2013, 00:05     Исключения потоков #10
gdb - это ахтунг в сравнении с нормальным гуевым дебагером.
можно попробовать QtCreator - вроде он умеет что-то дебажить.
Про другие ничего не могу сказать.
Yandex
Объявления
29.05.2013, 00:05     Исключения потоков
Ответ Создать тему
Опции темы

Текущее время: 12:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru