【问题标题】:error_code vs errnoerror_code 与 errno
【发布时间】:2013-04-05 05:57:08
【问题描述】:

我正在研究 C++11 标准。我想了解 error_code 和 errno 是否相互关联?如果是,那怎么办? 如果不是,那么我应该在哪些条件下设置 errno 以及在哪些条件下设置 error_code?​​p>

我做了一个小测试程序来理解这一点,但仍然有点困惑。请帮忙。

#include <iostream>
#include <system_error>
#include <thread>
#include <cstring>
#include <cerrno>
#include <cstdio>

using namespace std;

int main()
{
    try
    {
        thread().detach();
    } catch (const system_error & e) {
        cout<<"Error code value - "<<e.code().value()<<" ; Meaning - "<<e.what()<<endl;
        cout<<"Error no. - "<<errno<<" ; Meaning - "<<strerror(errno)<<endl;
    }
}

Output -
Error code value - 22 ; Meaning - Invalid argument
Error no. - 0 ; Meaning - Success

【问题讨论】:

  • 你的标题指的是一个叫做error_code的东西,但是你的代码没有提到它。
  • @Keith : e.code() 函数返回我正在使用值函数读取其值的 error_code 对象。

标签: c++ c++11 error-handling errno


【解决方案1】:

errno 被那些记录作为遇到错误的副作用的函数使用 - 这些函数是 C 库或从不抛出异常的 OS 函数。 system_error 是 C++ 标准库使用的,用于当您使用记录在案的库设施来引发该异常时。完全分开。最后,阅读您的文档!

【讨论】:

  • 那么我们是否可以方便地说那些设置error_code的库函数永远不会使用/设置errno?
  • @tshah06 error_code 未“设置”。这是system_error 异常的属性的类型(定义)。但我们可以方便地说,引发system_error 异常 的库函数从不使用/设置errno。这种二元性的存在只是因为您可以从 C++ 调用 C 函数(通过 errno 进行 C 样式的错误处理)。在“纯”C++ 中,异常是首选的错误处理机制,因此“纯”C++ 程序永远不必处理errno
  • @Arne:有道理。我想现在我已经很清楚了。谢谢。
  • @Arne :还有一个查询。如果异常是 C++ 中的错误处理机制,那么纯 C++ 函数不应该以返回码的形式报告错误,如果失败应该总是抛出异常?
  • @tshah06 - 每当有人谈论“纯”C++ 时,我都会感到紧张;它通常意味着意识形态而非工程视角。 C++ 是一种多范式语言,良好的工程意味着选择最合适的方法来解决问题,而不考虑“纯”与“不纯”的概念。一些函数返回错误代码;一些设置全局标志;一些函数抛出异常;一些函数中止程序。选择取决于错误是什么,适当的响应是什么,以及调用代码是否可以处理它。但是 errno 很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 2014-01-28
  • 2021-05-21
  • 2017-10-06
  • 2022-08-11
  • 2011-08-24
  • 2015-11-20
相关资源
最近更新 更多