我在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的参数,所以如果我可以转换errno为error_code那么其余的应该是显而易见的.
这似乎是一个非常基本的东西,所以我不知道为什么我找不到一个好的教程.
我在ARM处理器上使用gcc 4.4.5,如果这很重要的话.
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的错误代码:
errnowith std::generic_category:SO answer,llvm-commits,cplusplus.comerrnowith std::system_category:SO answer,cppreference.comGetLastError()用std::generic_category:SO回答GetLastError()with std::system_category:SO回答,SO评论但是,errno并且GetLastError()不能使用相同的类别,否则一些错误代码将是不明确的.错误代码33是一个例子,因为它是EDOM和ERROR_LOCK_VIOLATION.
甚至有些地方主张WinAPI的用户制作类别,但我目前找不到任何引用.这种替代方案会特别痛苦.
哪些类别应与使用errno,并应搭配使用GetLastError(),使
std::error_code::default_error_condition()std::error_code::message()是否简单且适用于底层错误代码?
我知道你不应该将打印与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)
实际上做了诀窍......(注意错误而不是我所期望的那样......),唯一困扰我的是,我不明白为什么以及如何弄明白:-(
可能重复:
perror的C++替代()
我找不到相当于的流perror.有这样的事吗?我喜欢我可以打电话的事实:
perror("Error");
Run Code Online (Sandbox Code Playgroud)
它将填补什么errno.我可以用溪流做这个吗?
谁能告诉我std::cerr和之间的用法区别是什么perror
void perror ( const char * str );
Run Code Online (Sandbox Code Playgroud)
我想知道在 C++ 应用程序中哪一个更可取,为什么它更可取。