LINUX.ORG.RU

C++ IOstream Library и вывод сообщений об ошибках


0

0

Есть следующий C++ код:

#include <fstream>
#include <ios>
#include <iostream>

int main(void)
{
	std::fstream file;
	file.exceptions(std::ios::badbit | std::ios::failbit);
	try
	{
		file.open("/test_file", std::ios::out);
	}
	catch(std::ios::failure &e)
	{
		std::cout << "File opening error: " << e.what() << std::endl;
	}
}
На выходе получаю:
File opening error: basic_ios::clear
А хотелось бы что-нибудь вроде:
File opening error: Permission denied

Есть ли в C++ какие-либо средства для получения строкового представления ошибок iostream?

anonymous

Попробуй, что-либо, навроде -

#include <fstream>
#include <ios>
#include <iostream>

int main(void)
{
std::fstream file;
file.exceptions(std::ios::badbit | std::ios::failbit);
try
{
file.open("/test_file", std::ios::out);
if (!file.is_open ())
throw (std::ios::failure ("Permission denied"));

}
catch(std::ios::failure &e)
{
std::cout << "File opening error: " << e.what() << std::endl;
}
}

MiracleMan ★★★★★
()
Ответ на: комментарий от MiracleMan

> throw (std::ios::failure ("Permission denied"));

ну тогда уж хотя бы так:

#include <cerrno>
#include <cstring>

...
throw (std::ios::failure (::strerror(errno)));

но это всё равно не то. если обрабатывать ошибки вручную, то исключения в данном случае не нужны. скорее, наоборот, лишь усложняют и запутывают картину.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

>но это всё равно не то. если обрабатывать ошибки вручную, то исключения в данном случае не нужны. скорее, наоборот, лишь усложняют и запутывают картину.

Да это понятно, что это не тот случай, но топикстартер сам желал увидеть как бы это могло выглядеть в принципе.

MiracleMan ★★★★★
()
Ответ на: комментарий от klalafuda

> throw (std::ios::failure (::strerror(errno)));
А это можно считать портабельным способом?

> но это всё равно не то. если обрабатывать ошибки вручную,
> то исключения в данном случае не нужны. скорее, наоборот,
> лишь усложняют и запутывают картину.
Полностью с вами не согласен. Представим такую ситуацию. Необходимо прочитать конфигурационный файл. Есть функция read_config(const std::string& config_path), которая принимает путь к конфигурационному файлу и возвращает объект, содержащий прочитанные настройки. В случае ошибки функция генерирует исключение, причем, если произошла ошибка при чтении файла, exception.what() выдает то, что выдала strerror(), а в случае, к примеру, ошибки при парсинге файла - "configuration parsing error".

В итоге код чтения конфига будет выглядеть следующим образом:

void foo(const std::string& config_path)
{
    Config config;

    try
    {
        config = read_config(config_path);
    }
    catch(std::exception& e)
    {
        some_gui_warning_message_function( boost::format("Error while reading configuration file '%1%': %2%") % config_path % e.what() );
        return;
    }

    // Обработка прочитанных опций.
}

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.