Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
miss-julia
2 / 2 / 0
Регистрация: 26.10.2014
Сообщений: 44
#1

Обработка исключительной ситуации с файлом - C++

09.06.2015, 13:24. Просмотров 473. Ответов 12
Метки нет (Все метки)

нужно сделать обработку исключительной ситуации- невозможность открыть файл.
здесь на try выплывает необработанное исключение.
C++
1
2
3
4
5
6
7
8
9
10
11
12
fstream fin;  
  char name[]("cpstudio.txt");
    
    if (!fin.is_open())  
    {
    throw name;  
    }
    try{
        //не понимаю что здесь нужно писать, пробвала fstream fin;
    
         }
    catch(char*name){cout<<"Невозможно открыть файл "<<name;exit(1);}
в общем правильно или нет? только начинаю изучение исключительных ситуаций...а лабу доделать надо,помогите пожалуйста!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2015, 13:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обработка исключительной ситуации с файлом (C++):

Обработка исключительной ситуации переполнения вещественного числа - C++
Помогите написать программу, которая выполняет обработку исключительной ситуации переполнения вещественного числа, я в целов поняла, что...

Возбуждение исключительной ситуации - C++
Помогите плз сгенерировать исключение. Требуется создать функцию, которая заполняет массив и возвращает true если это сделать удается,...

Изменение окна сообщения для исключительной ситуации - C++
В программе есть контролируемая исключительная ситуация. Мне надо програмно изменить надпись вверху. Сейчас эта надпись берётся из...

Обработка исключительных ситуации - C++
Постройте таблицу значений функции y=f(x) для с шагом h. Если в некоторой точке x функция не определена, то выведите на экран сообщение...

Обработка ситуации с нехваткой динамической памяти - C++
Хочу обработать ситуацию с нехваткой памяти. Пишу стандартно: A=new double; if(!A) {...;} Но дебагер до if-а не доходит, я...

обработка сторок и работа с файлом - C++
Имеется исходный файл(с кодом программы, файл txt), нужно из него считать текст и затем в этом тексте заменить begin на BEGIN и записать...

12
dvano
132 / 63 / 16
Регистрация: 18.06.2014
Сообщений: 216
Завершенные тесты: 1
09.06.2015, 13:29 #2
Выброс исключения должен быть в блоке try{}, а обработка - в блоке catch(...){}
0
miss-julia
2 / 2 / 0
Регистрация: 26.10.2014
Сообщений: 44
09.06.2015, 14:36  [ТС] #3
dvano, а поподробнее можно? или пример?
0
dvano
132 / 63 / 16
Регистрация: 18.06.2014
Сообщений: 216
Завершенные тесты: 1
09.06.2015, 14:49 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   fstream fin;  
   char name[]("cpstudio.txt");
    
   try
   {
      if (!fin.is_open())  
      {
         throw name;  
      }
   }
   catch(char*name)
   {
      cout<<"Невозможно открыть файл "<<name;exit(1);
   }
0
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
09.06.2015, 14:54 #5
Только сначала нужно поток с именем файла связать, а то непонятно, что открывается.

Добавлено через 1 минуту
И паузу, перед выходом, сделать.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
09.06.2015, 15:43 #6
Смысла в обработке исключений на том же уровне, где оно кидается - ноль.
Вся суть использования исключений в том, чтобы сообщить о проблеме из низкого уровня (там, где не понятно как обрабатывать ошибку) в более высокий уровень (где уже ясно, что с ней делать).
В предложенном здесь коде по факту не нужен ни try, ни catch, ни throw.
0
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
09.06.2015, 16:16 #7
Цитата Сообщение от miss-julia Посмотреть сообщение
нужно сделать обработку исключительной ситуации- невозможность открыть файл.
Tulosba, предложи вариант из низкого уровня.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
09.06.2015, 16:40 #8
Цитата Сообщение от lss Посмотреть сообщение
предложи вариант из низкого уровня.
Низкий уровень - функция открытия файла. В случае ошибки кидает (но не обрабатывает) исключение.
Высокий уровень - клиентский код, использующий эту функцию явно или косвенно. Вызывает в try, обрабатывает в catch.
Всё. Такое уже имеет смысл быть. А делать всё в одной функции - это бред.
1
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
09.06.2015, 16:44 #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <fstream>
 
int main()
{
    std::fstream fs ;
    fs.exceptions(std::ios::badbit | std::ios::failbit | std::ios::eofbit) ;
    try
    {
        fs.open("sdds") ;
    } catch (const std::ios_base::failure & e)
    {
        std::cerr << "can not open file\nwhat: " << e.what() << "\n";
    }
}
1
mymedia
192 / 192 / 48
Регистрация: 27.05.2011
Сообщений: 544
09.06.2015, 16:46 #10
Что касательно ошибок при открытии файла, то можно поступить следующим образом
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <fstream>
 
int main() 
{
    int ivalue;
    try {
        std::ifstream in("in.txt");
        in.exceptions(std::ifstream::failbit);
        in >> ivalue;
    } catch (std::ios_base::failure &fail) {
        std::cout << fail.what() << std::endl;
    }
}
Что касательно исключений, то это просто-напросто способ передачи управления. try, throw и catch — это такая же управляющая структура как цикл, условный выбор, вызов функции. На мой взгляд, исключения можно представить как вызов функции с одним параметром:
C++
1
2
3
4
5
6
7
8
9
10
11
try {
    // замудрённые вызовы функций, внутри которых встречается следующая строчка
    throw /* желательно объект какого-нибудь класса */;
    // ...
} catch(/* тип */ /* имя аргумента (не обязательно) */) {
    // ...
} catch (...) {
    // у функций тоже может быть многоточие вместо аргументов
    // поэтому за сходство блока catch с телом функции, можно представить,
    // что генерация исключения = вызов функции
}
0
lss
921 / 850 / 281
Регистрация: 10.10.2012
Сообщений: 2,701
09.06.2015, 18:42 #11
Цитата Сообщение от Tulosba Посмотреть сообщение
А делать всё в одной функции - это бред
То есть, fin.is_open() не к месту? Правильно понял?
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
09.06.2015, 19:13 #12
Цитата Сообщение от lss Посмотреть сообщение
То есть, fin.is_open() не к месту?
С точки зрения логики проверки - пожалуйста. Но не надо объединять throw и try на уровне одной функции.
Например код из сообщения #4 по факту эквивалентен такому (немного подравнял):
C++
1
2
3
4
5
6
7
const char* name = "cpstudio.txt";
fstream fin(name);
if (!fin.is_open())  
{
   cout<<"Невозможно открыть файл "<<name; 
   exit(1);
}
Т.о. исключения тут вообще ни к месту, т.к. всё можно построить на обычном ветвлении if/else... без уродования кода.
1
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,356
Записей в блоге: 2
Завершенные тесты: 1
09.06.2015, 19:18 #13
достаточно просто
C++
1
if (!fin) {}
там operator bool() проверяет все, что по дефолту нужно.
0
09.06.2015, 19:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2015, 19:18
Привет! Вот еще темы с ответами:

Работа с текстовым файлом: как посчитать кол-во букв в слове? (посимвольная обработка) - C++
Работа с текстовым файлом: как посчитать кол-во букв в слове? (посимвольная обработка)

исключительные ситуации - C++
почему не работает?? как надо?? #include&lt;iostream&gt; #include&lt;conio.h&gt; using namespace std; template&lt;class T&gt; class Vector...

Исключительные ситуации - C++
Функция должна выполнять проверку параметров, передаваемых и генерировать исключения в случае ошибки. Без спецификаторов исключений; ...

Исключительные ситуации - C++
Надо сделать так, чтоб при вводе чарового символа в итовый вектор выводило сообщение об ошибке, но программа не закрывалась, а просто...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru