Я открываю два файла, один входной и один выходной. Я хотел бы обрабатывать исключения для них обоих, поэтому, посмотрев на несколько примеров, я сделал следующее:

std::ifstream readFile;
readFile.exceptions (std::ifstream::failbit | std::ifstream::badbit);
//set the flags for stream bits that indicate failure if ON
std::ofstream writeFile;
writeFile.exceptions (std::ifstream::failbit | std::ifstream::badbit);


try{
    readFile.open(inputFileName);
    writeFile.open(outputFileName);

    function(readFile, writeFile);

    readFile.close();
    writeFile.close();
}
catch(std::ifstream::failure &readErr) {
    std::cerr << "\n\nException occured when reading a file\n"
              << readErr.what()
              << std::endl;
    return -1;
}
catch(std::ofstream::failure &writeErr) {
    std::cerr << "\n\nException occured when writing to a file\n"
         << writeErr.what()
         << std::endl;
    return -1;
}

Это кажется разумным решением, но я получаю предупреждение:

warning: exception of type 'std::ios_base::failure' will be caught [enabled by default]
     catch(std::ofstream::failure &writeErr) {
     ^

Код делает это, но я все еще заинтересован в улучшении своего кода. Где я обиделся?

1
jabk 24 Окт 2014 в 11:58

2 ответа

Лучший ответ

Нет, не можешь. Typedef для std::ifstream::failure и std::ofstream::failure оба определены как std::ios_base::failure.

Лучшее, что вы можете сделать, - это обернуть отдельные вызовы с помощью try-catch:

try
{
  readFile.open(inputFileName);
}
catch(std::ifstream::failure &readErr) 
{
}

try
{
   writeFile.open(outputFileName);
}
catch(std::ofstream::failure &writeErr) 
{
}

Или проверьте состояние потоков по отдельности в блоке catch, чтобы узнать, кто потерпел неудачу.

4
Yochai Timmer 17 Май 2016 в 20:48

Единственный способ обрабатывать исключения из двух файлов по отдельности - это перехватить исключение, а затем проверить бит отказа в потоках, чтобы определить, какой из них отказал:

try
{
    readFile.open(inputFileName);
    writeFile.open(outputFileName);

    function(readFile, writeFile);

    readFile.close();
    writeFile.close();
}
catch (const std::ios_base::failure &err)
{
    if (readFile.fail())
    {
        std::cerr << "\n\nException occured when reading a file\n"
                  << readErr.what()
                  << std::endl;
    }
    if (writeFile.fail())
    {
        std::cerr << "\n\nException occured when writing to a file\n"
                  << writeErr.what()
                  << std::endl;
    }

    return -1;
}
1
heksesang 24 Окт 2014 в 08:52