相关疑难解决方法(0)

如何使用<system_error>将errno转换为异常

我在C++ 11中阅读了一系列关于新<system_error>标题的深思熟虑的博客文章.它表示标头定义了一个error_code类,它表示操作(例如系统调用)返回的特定错误值.它表示标头定义了一个system_error类,它是一个异常类(继承自runtime_exception)并用于包装error_codess.

我想知道的是如何将系统错误实际转换errno为一个,system_error所以我可以抛出它.例如,POSIX open函数通过返回-1和设置来报告错误errno,因此如果我想抛出异常,我应该如何完成下面的代码?

void x()
{
    fd = open("foo", O_RDWR);
    if (fd == -1)
    {
        throw /* need some code here to make a std::system_error from errno */;
    }
}
Run Code Online (Sandbox Code Playgroud)

我随机试了一下:

errno = ENOENT;
throw std::system_error();
Run Code Online (Sandbox Code Playgroud)

但是在what()调用时,结果异常不返回任何信息.

我知道我可以做throw errno;但我想以正确的方式使用新的<system_error>标题.

有一个构造函数system_error需要一个单独error_code的参数,所以如果我可以转换errnoerror_code那么其余的应该是显而易见的.

这似乎是一个非常基本的东西,所以我不知道为什么我找不到一个好的教程.

我在ARM处理器上使用gcc 4.4.5,如果这很重要的话.

c++ exception c++11

52
推荐指数
2
解决办法
1万
查看次数

<system_error>类别和标准/系统错误代码

C++ 11引入了<system_error>包含通用系统的头文件来处理错误代码.An std::error_code是一个元组,包含一个int错误代码和一个对a的引用std::error_category,它定义了错误域和错误代码的处理.标准库带有四个类别:std::generic_category,std::system_category,std::future_category,和std::iostream_category.

有冲突,在其上使用的类别,都在这里SO和C++的参考点,创建时std::error_codeS /投掷std::system_error以s errno和WinAPI的错误代码:

但是,errno并且GetLastError()不能使用相同的类别,否则一些错误代码将是不明确的.错误代码33是一个例子,因为它是EDOMERROR_LOCK_VIOLATION.

甚至有些地方主张WinAPI的用户制作类别,但我目前找不到任何引用.这种替代方案会特别痛苦.

哪些类别应与使用errno,并应搭配使用GetLastError(),使

  • std::error_code::default_error_condition()
  • std::error_code::message()

是否简单且适用于底层错误代码?

c++ winapi posix c++11 system-error

26
推荐指数
2
解决办法
4760
查看次数

c ++将printf与wprintf混合(或cout与wcout混合)

我知道你不应该将打印与printf,cout和wprintf,wcout混合,但很难找到一个好的答案为什么以及是否有可能绕过它.问题是我使用一个外部库,用printf打印,我自己使用wcout.如果我做一个简单的例子它工作正常,但从我的完整应用程序它只是不打印printf语句.如果这确实是一个限制,那么会有许多库无法与广泛的打印应用程序一起工作.对此的任何见解都非常受欢迎.

更新:

我把它归结为:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

#include <readline/readline.h>
#include <readline/history.h>

int main()
{
    char *buf;

    std::wcout << std::endl; /* ADDING THIS LINE MAKES PRINTF VANISH!!! */

    rl_bind_key('\t',rl_abort);//disable auto-complete

    while((buf = readline("my-command : "))!=NULL)
    {
        if (strcmp(buf,"quit")==0)
            break;

        std::wcout<<buf<< std::endl;

        if (buf[0]!=0)
            add_history(buf);
    }

    free(buf);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以我想这可能是一个冲动的问题,但它看起来仍然很奇怪,我必须检查它.

更新 - >解决方法:

首先,wprintf出现同样的问题.但我发现添加:

std::ios::sync_with_stdio(false);
Run Code Online (Sandbox Code Playgroud)

实际上做了诀窍......(注意错误而不是我所期望的那样......),唯一困扰我的是,我不明白为什么以及如何弄明白:-(

c++

10
推荐指数
2
解决办法
3535
查看次数

与perror相当的C++流是什么?

可能重复:
perror的C++替代()

我找不到相当于的流perror.有这样的事吗?我喜欢我可以打电话的事实:

perror("Error");
Run Code Online (Sandbox Code Playgroud)

它将填补什么errno.我可以用溪流做这个吗?

c++

5
推荐指数
2
解决办法
5142
查看次数

perror 和 std::cerr 使用

谁能告诉我std::cerr和之间的用法区别是什么perror

void perror ( const char * str );
Run Code Online (Sandbox Code Playgroud)

我想知道在 C++ 应用程序中哪一个更可取,为什么它更可取。

c++

5
推荐指数
1
解决办法
2418
查看次数

标签 统计

c++ ×5

c++11 ×2

exception ×1

posix ×1

system-error ×1

winapi ×1