Помогите разобраться с исключениями C++

194
28 апреля 2018, 18:19

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

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

#include <iostream>
        #include <fstream> 
        #include <string>
        using namespace std;
        void CopyFileFunction(const string& OutFile,const string& InFile)
        {
                        char BufferRider[50];
                        ifstream Rider(OutFile);
                        Rider.getline(BufferRider, 50);
                        cout << BufferRider;
                        Rider.close();
                        ifstream fil(InFile);
                        fil.close();
                        ofstream file(InFile);
                        file << BufferRider;
                        file.close();
        }
        void FileNotFound(const string& OutFile)
        {
            cout << "Attempt to open or create a file." << endl;
            ifstream FileNot(OutFile);
            FileNot.exceptions(ifstream::badbit | ifstream::failbit);//Включаем в классе ifstream подробные данные об ошибке.
            if (!FileNot.is_open()) {
                throw exception("File not fount!");
            }
        }
        void Overwriting(const string& OutFile)
        {
            ifstream FileNot(OutFile);
            FileNot.exceptions(ifstream::badbit | ifstream::failbit);//Включаем в классе ifstream подробные данные об ошибке.
            if (FileNot.is_open()) {
                throw ("File is OK!");
            }
        }

        int main()
        {
                 try{
                        string OutFile, InFile;
                        cout << "Please,enter file name(with format).\n";
                                getline(cin, OutFile);
                                FileNotFound(OutFile);
                                Overwriting(OutFile);
                        cout << "Please,enter output file name(with format).\n";
                                getline(cin, InFile);
                                CopyFileFunction(OutFile, InFile);
                        cout << "Files copy!" << endl;
                    }
            catch (const ifstream::failure &NotFound){//Передаем специальный класс в катч для отлова исключений(все классы в катч наследуются от expention).
                cout <<endl << NotFound.what() << endl;
                cout <<"\nCode a mistake:" << NotFound.code() << endl;
            }
            catch (const char &Found) {//Передаем как строку.
                cout  << Found << endl;
            }

            //catch (...) { cout << "Opss,work filed!"; }//Для всего остального.

            system("pause");
            return 0;
        }

      [1]: https://i.stack.imgur.com/f0rRY.jpg

  [1]: https://i.stack.imgur.com/8y89f.jpg
Answer 1

Это мягко говоря плохой случай генерации исключения. Ну а не будет копировать, потому что исключение распространяется вверх по стеку уничтожая все локальные переменные на своем пути. Так исключение доберется до блока try catch, и тут то должен обработать это исключение блок catch, которого у вас нет.

В итоге: вы генерите исключение. Оно идёт вверх по стеку в поисках первого try catch. Если не находит блок, завершится все ошибкой (ваш вариант). Как видите, ни о каком дальнейшем выполнении кода, который идёт после функции генерящей исключение нет

Answer 2

Решение нашлось,поместил обработку исключений в функции.Извините за потраченное время ,ролики на ютубе насмотрелся) теперь правлю.

#include <iostream>
#include <fstream> 
#include <string>
using namespace std;
void CopyFileFunction(const string& OutFile,const string& InFile){
                char BufferRider[50];
                ifstream Rider(OutFile);
                Rider.getline(BufferRider, 50);
                cout << "Wath in file:" << BufferRider << endl;
                Rider.close();
                ofstream file(InFile);
                file << BufferRider;
                file.close();   
}
void FileNotFound(const string& OutFile){
    cout << "\nAttempt to open or create a file..." << endl;
    try {ifstream FileNot(OutFile);if(!FileNot.is_open()){
        throw exception("File not fount!");}}
    catch(const exception &NotFound) {
        cout << "\n\t\t\t\tAlert;" << endl;
        cout << NotFound.what() << endl;
    }
}
void Overwriting(const string& InFile){
    try {ifstream FileYes(InFile);if(FileYes.is_open()){throw exception("File fount,owerwriting?");}}
    catch (const exception &NotFound) {
        cout << "\n\t\t\t\tAlert;" << endl;
        cout << NotFound.what() << endl;}}
int main(){
                string OutFile,InFile;
                cout << "Please,enter file name(with format):";
                        getline(cin,OutFile);FileNotFound(OutFile);
                cout << "Please,enter output file name(with format):";
                        getline(cin,InFile); Overwriting(OutFile);CopyFileFunction(OutFile,InFile);
                cout << "\n\t\tFiles copy!" << endl;
                system("pause");
                return 0;}
READ ALSO
Не получается создать проект C++ в Visual Studio 2017

Не получается создать проект C++ в Visual Studio 2017

Когда я пытаюсь создать/открыть проект Visual C++, я получаю такое сообщение:

214
удаление элемента односвязного списка

удаление элемента односвязного списка

Помогите понять в чем ошибкаУдаляет все правильно, но при выводе списка в консоли вылетает ошибка

197
закрытие программы при помощи ctrl-c

закрытие программы при помощи ctrl-c

Доброй ночи, форумчанеТакой вопрос: Как в переодичной функции обратного типа(CALLBACK WindProc()) закрывать окно при помощи CTRL+C? Знаю что можно через...

178
Подключить Opengl 4.3 к qt

Подключить Opengl 4.3 к qt

Как прикрутить Opengl 43 к проекту qt

180