std::error_category 可用于动态消息吗?
Is std::error_category usable with dynamic messages?
我正在开发一个与远程系统对话的库,虽然它 returns 错误代码的数量有限且已知,但消息可能会以不可预测的方式发生变化。
所以我 std::error_code
为我的库的用户提供一种处理 C++ 原生错误的方法,而不是推出我自己的代码。我不能抛出异常。
Tutorials 关于 std::error_category
的使用总是显示静态实例与根据错误代码返回的硬编码消息一起使用。
但是如果我们有无法缓存的动态消息怎么办?我们如何 link 将特定消息发送到 std::error_code
的特定实例?
简答:你真的做不到。
error_code
是一种可复制的值类型。如果允许自定义消息,复制错误将涉及对消息数据进行深度复制,或维护引用计数。
这会使错误代码太重而无法在许多 application/library 内部循环中使用,基本上迫使程序员对该部分代码使用不同的错误处理机制,从而使 error_code
基本上毫无意义.
您可以通过使用线程本地错误状态(如老派 errno
)来解决这个问题,但我不建议这样做,因为它会阻止您存储任何错误时间长度。
我正在开发一个与远程系统对话的库,虽然它 returns 错误代码的数量有限且已知,但消息可能会以不可预测的方式发生变化。
所以我 std::error_code
为我的库的用户提供一种处理 C++ 原生错误的方法,而不是推出我自己的代码。我不能抛出异常。
Tutorials 关于 std::error_category
的使用总是显示静态实例与根据错误代码返回的硬编码消息一起使用。
但是如果我们有无法缓存的动态消息怎么办?我们如何 link 将特定消息发送到 std::error_code
的特定实例?
简答:你真的做不到。
error_code
是一种可复制的值类型。如果允许自定义消息,复制错误将涉及对消息数据进行深度复制,或维护引用计数。
这会使错误代码太重而无法在许多 application/library 内部循环中使用,基本上迫使程序员对该部分代码使用不同的错误处理机制,从而使 error_code
基本上毫无意义.
您可以通过使用线程本地错误状态(如老派 errno
)来解决这个问题,但我不建议这样做,因为它会阻止您存储任何错误时间长度。