问题标签 [std-system-error]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++11(或 Boost)system_error 策略
我正在开发一个系统,该系统旨在使用名为error_code
,error_condition
和error_category
- 一个新的方案 std: 在 C++11 中,尽管目前我实际上正在使用 Boost 实现。我已经阅读了 Chris Kholkoff 的系列文章,现在已经三遍了,我想我大致了解了如何创建这些类。
我的问题是该系统需要处理存在于单个 DLL 中的插件,并且这些插件可能会出现错误。我最初的设计是计划一个特定于系统的错误类别,该类别将包含所有各种错误代码和一个不真正映射到errno
值的特定错误条件的候选清单。这里的问题是,要使 DLL 能够使用这些错误代码之一,它需要访问error_category
应用程序中的唯一实例。我现在通过SetErrorCategory()
从每个 DLL 导出一个函数来处理这个问题,这个函数可以工作,但有点恶心。
我看到的替代解决方案是每个 DLL 都有自己的错误类别和代码,如果需要,还有自己的条件;我怀疑这更像是为这个库功能所设想的。但是,我认为这需要主应用程序的错误方案中的比较功能,该功能了解插件的错误方案,并可以检查应用程序的哪些条件与插件的错误匹配。这似乎更容易出现一堆问题,尽管我还没有尝试实现它。我猜我必须在所有实际逻辑之上从 DLL 中导出整个错误方案。
当然,另一种方法是仅使用 DLL 中的数字错误代码并将它们填充到应用程序端的错误对象中。它具有插件简单的优点,但可能会导致应用程序中的陷阱(例如,处理来自几个不同插件的对象的函数需要注意每个错误的来源)。
所以我的具体问题是:在这三个选项中,你会使用哪个,为什么?哪个明显行不通?当然,我还没有想到更好的方法吗?
c++ - 在带有 msvc11 的静态类析构函数中使用 std::system_category()
我对 C++ 很陌生,但我想确保在向 Microsoft 报告错误之前我没有做错什么。
这是一些示例代码:
现在,我希望 Windows 会说“运行时已请求程序以意外方式退出”。但是,我得到一个“称为纯虚函数”的错误。通过一点调试,我注意到当静态类析构函数获取std::system_category
引用时,::name
和::message
成员是纯虚拟的。但是,当它在 中构造时testfunc()
,那些 vtable 指针指向有效函数。
system_error
我的问题是,以这种方式构建异常,我做错了什么吗?我有一些基本上在做的代码throw system_error(GetLastError(), system_category());
。这恰好在静态析构函数中执行,我得到了一个名为 error 的纯虚函数。
要从 Windows 的GetLastError()
函数中抛出异常,我应该以不同的方式构建我的异常,还是这是 msvc11 的 C++ 运行时中的错误?
编辑
我的问题有点混乱。我的实际代码比这个例子更复杂,我实际上没想到我的析构函数之一会抛出。我的析构函数必须调用一个可能抛出的函数。如果我将代码更改为:
我仍然会得到纯虚函数调用错误。这是因为当 system_error 被构造(在 中callSOmeFuncThatCouldThrow()
)时,它会尝试使用我给它的::message
成员,这会导致错误。system_category
c++ - C++ 线程,std::system_error - 不允许操作?
所以我写了一个程序来测试 64 位 kubuntu linux,版本 13.04 上的线程。实际上,我从正在编写测试程序的其他人那里窃取了代码。
我编译使用:
然后跑:
顺便说一句,当我输入“ls -l”时,main.out 像所有可执行文件一样以绿色文本显示,但名称末尾还有一个星号。为什么是这样?
回到手头的问题:我跑main.out的时候,出现了一个错误,说:
有人对如何解决这个问题有任何想法吗?
c++ - 在不复制数据的情况下,决定 what() 从继承自 std::system_error 的类中返回什么的符合标准的方法是什么?
我使用继承自的类std::system_error
进行错误处理,并且我想控制what()
调用时返回的内容。原因:标准(C++11 和草稿 C++1y CD - N3690,下面的 § 引用属于后者)没有指定返回的字符串what()
应该是什么样子,它只是在 §19.5 中给出了注释.6.2 (14):
注意:返回的 NTBS 可能是
what_arg + ": " + code.message()
. ——尾注
所以它应该被认为是依赖于实现的。(顺便说一句,不应该code().message()
代替code.message()
吗?)
what()
所以,问题是:如果我想要符合标准并且不依赖于实现(即想要可移植),我该如何精确定义返回的字符串?
对于那些喜欢代码的人:
好的,我不喜欢的一个简单的解决方案可能如下:
既然std::exception::what()
是虚拟的,它就可以工作,但是有没有更优雅的方法而不使用任何实现细节?我不喜欢存储两个字符串的想法:一个std::system_error
在my_what
.
问题的根源:std::runtime_error——恰好是 std::system_error 的父类——在 §1.9.2.6 (3) 中有一个确切的要求,即构造函数的后置条件:
其中,std::system_error
在 §19.5.6.2 (2) 中变为以下内容:
有没有人知道为什么标准如此努力地包含code().message()
在内what()
?请注意,它code()
返回错误代码对象,因此任何人都可以随时将其包含code().message()
在字符串中(即使在捕获此类异常时)。
如果 的 要求与std::system_error
的 相同std::runtime_error
,我可以写:
有没有优雅便携的解决方案?
更新:下面的许多评论都指出错误消息是实现定义的。我明白,我只想格式化返回的字符串what()
,我不想在所有系统上都逐字节等效。想想我想记录它或将它传递给第三方,它应该遵循一些固定的格式(这不是标准所建议的)。
UPDATE2:我相信 std::system_error 不仅适用于操作系统或 STL 错误。我可以(并且假设)从中派生出我自己的类并将它们用于错误报告。如果我正在编写低级 API 怎么办?顺便问一下,为什么禁止在高级 API 中使用它?
如果我在我的 API 的错误处理部分将所有参数传递给它的构造函数,则不涉及实现定义(即未知)的错误字符串,但我仍然无法在不复制数据的情况下对其进行格式化。
c++ - 如何使用 `std::error_category` 和 system_error 标头中的其他内容?
C++ 中已经有足够多的错误处理策略。我们有异常处理、错误返回码和这种ERRNO
混乱。标头在这里起什么作用system_error
?如何使用其中的功能?对我来说,它看起来只是随机组合在一起的。我使用cppreference站点作为参考。
c++ - 了解C++11 中的设施
我正在尝试使用该system_error
工具来处理我的图书馆中的错误。如果你觉得它有帮助,我将简要讨论库的结构: 库的命名空间被调用commons
,在这个命名空间下我有另一个命名空间dynlib
. dynlib
包含负责加载 .so/.dll 文件的类:
DynLibLoader 中可能出现的错误LibraryFailedToLoad
是LibraryFailedToUnload
和SymbolNotFound
。所以我处理错误的想法如下:我将在命名空间error
下添加一个命名空间dynlib
。然后,在该命名空间下,我将定义一个 enum forstd::error_codes
和一个 enum for std::error_conditions
。据我了解,std::error_codes
必须对应于errno
(Linux) 或GetLastError
(Win32) 的std::error_conditions
值LibraryFailedToLoad
,以及 等值SymbolNotFound
。所以,这是我的问题:
- 我的理解
std::error_code
是否std::error_condition
正确? - 我应该如何知道所有可能的值
errno
并GetLastError()
在我的std::error_codes
枚举下定义它们?如果 Microsoft 将来向 API 添加额外的错误值怎么办?我是否必须返回源代码并在我拥有的枚举下定义它们std::error_codes
? - 如果我们在另一个平台上并且在发生错误时无法找出确切的系统错误代码怎么办?
- 如果我想
std::error_codes
为整个公共命名空间使用相同的名称,并且只std::error_condition
为每个子名称空间定义一个不同的名称,例如dynlib
. 这是一个好习惯吗?我会说是的,因为这将避免重复代码。但这背后有什么问题吗? - 目前,我
std::error_category
为公共的每个子命名空间使用一个。这是一个好习惯吗?你认为我应该使用std::error_category
不同的方式吗?
c++ - 类别和标准/系统错误代码
C++11 引入了<system_error>
包含通用系统来处理错误代码的标头。Anstd::error_code
是一个元组,包含一个int
、错误代码和对 an 的引用std::error_category
,它定义了错误域和错误代码的处理。标准库有四个类别:std::generic_category
、std::system_category
、std::future_category
和std::iostream_category
。
在使用和 WinAPI 错误代码创建std::error_code
s/throwing时,在 SO 和 C++ 参考站点上使用哪个类别存在冲突:std::system_error
errno
errno
withstd::generic_category
: SO answer , llvm-commits , cplusplus.comerrno
与std::system_category
:所以回答,cppreference.comGetLastError()
与std::generic_category
:所以回答GetLastError()
与std::system_category
:所以回答,所以评论
但是,errno
又GetLastError()
不能使用同一个类,否则有些错误代码会产生歧义。错误代码 33 就是一个示例,因为它同时是EDOM
和ERROR_LOCK_VIOLATION
。
甚至有些地方提倡 WinAPI 的用户自定义类别,但我目前找不到任何参考。这种选择会特别痛苦。
应该使用哪个类别errno
,以及应该使用哪个类别,GetLastError()
以便
std::error_code::default_error_condition()
std::error_code::message()
是否明确且适合底层错误代码?
c++ - 互斥锁操作是否应该抛出 system_error 以锁定两次?
这是代码
device or resource busy, generic: 16
预期有输出,但从未见过。
gcc 版本 4.8.4
ps
上面的代码来自 Bjarne Stroustrup 的书——C++ 编程语言,42.3.1.2 mutex Error。根据这本书,应该出现一个system_error。这个关于“未定义行为”的问题是在 2012 年发布的,甚至在这本书出版之前。
c++ - std::exception 是否拥有`what()`?
我正在派生我自己的异常,调用它MyException
,std::system_error
并已覆盖what()
以计算并返回我的消息。MyException
的初始值设定项列表不调用接受消息的 system_error 构造函数覆盖。
如果我抓住 aMyException
并将其复制到 astd::exception
调用iswhat()
的结果。这是有道理的。std::exception
nullptr
我的问题是,如果我确实使用了 system_exception 的构造函数,该构造函数在初始化时接收消息MyException
,是否指定 system_error 将获取消息的副本并拥有它并释放它?
我假设这将使 的std::exception
副本MyException
能够返回有效的what()
. 尽管我会因为每次MyExceptions
创建新的“什么”都需要计算而受到性能影响;只有在第一次调用 what() 时,我才能懒惰地计算它。
我有点担心what()
返回 achar*
而不是 a的 'what' 字符串的所有权const std::string&
。
代码是这样的(我还没有编译过):
c++ - 什么会导致可连接线程在调用 join 时失败
当我调用 joinThread 时,偶尔会std::system_error
在 join 调用中抛出“无效参数”。该错误似乎只在我使用 gcc 编译时出现,并且它并非始终可重现,即它偶尔会发生并且不可预测。有谁知道什么可能导致这样的错误?
下面是我的代码的简化版本。
任何帮助将不胜感激。