- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试使用 system_error
工具来处理我的库中的错误。我将简要讨论该库的结构,以防您发现它对您有所帮助:该库的 namespace 称为 commons
,在此之下我还有另一个 namespace 称为 dynlib
。 dynlib
包含负责加载 .so/.dll 文件的类:
namespace commons {
namespace dynlib {
class DynLibLoader {
};
}
}
DynLibLoader 中可能出现的错误有 LibraryFailedToLoad
、LibraryFailedToUnload
和 SymbolNotFound
。所以我处理错误的想法如下:我将在命名空间dynlib
下添加一个命名空间error
。然后,在该命名空间下,我将为 std::error_codes
定义一个枚举,为 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
吗?最佳答案
主要区别在于 std::error_condition
是可移植的(平台无关),而 std::error_code
是平台相关的。通常,低级平台相关代码生成 error_codes
,客户端代码将这些 error_codes
与平台无关 error_conditions
进行比较。
19.5 [syserr] 定义了一长串标准(和可移植的)错误条件(例如 errc::no_such_file_or_directory
),它们明确关联到 errno
的特定值(例如ENOENT
)。因此,您不需要知道系统上生成的 errno
或 GetLastError()
可能值的完整列表。您只需要知道与您的代码相关的标准值。例如,您的库实现可能如下所示:
void MyLibraryClass::foo(std::error_code &ec)
{
// whatever platform dependent operation that might set errno
// possibly with alternative platform-dependent implementations
ec = make_error_code(errno);
}
然后您的客户端代码将检查 error_code
是否匹配任何特定的 error_condition
:
error_code ec;
myLibraryInstance.foo(ec);
if (!ec)
{
// success
}
else if (errc::no_such_file_or_directory == ec)
{
// no_such_file_or_directory
}
else
{
// unknown or unexpected error
}
在您的情况下,您可能会定义自己的错误枚举(只有一个枚举)并将其标记为 error_conditions
以启用自动转换:
namespace commons
{
namespace dynlib
{
enum class errc {LibraryFailedToLoad=1, LibraryFailedToUnload, SymbolNotFound};
}
}
namespace std
{
template<> struct is_error_condition_enum<commons::dynlib::errc> : true_type {};
}
// TODO: implement make_error_code and make_error_condition
然后,您可以将各种平台相关操作的结果转换为适当的 error_condition
(或 error_code
,如果您愿意):
void DynLibLoader::open(std::error_code &ec)
{
// possibly implement the windows version here as well
if (NULL == dlopen(filename, flag))
{
ec = make_error_code(errc::LibraryFailedToLoad);
}
}
您的客户端代码会将错误代码与可能的错误条件进行比较,如上:
error_code ec;
dynLibLoader.open(ec);
if (!ec)
{
// success
}
else if (commons::dynlib::errc::LibraryFailedToLoad == ec)
{
// Library Failed To Load
}
else
{
// unknown or unexpected error
}
请注意,枚举 commons::dynlib::errc::LibraryFailedToLoad
会自动转换为 error_condition
(使用提供的 make_error_condition
方法) 因为 commons::dynlib::errc
被标记为 is_error_condition_enum
。
error_category
到命名空间的映射可能是个人喜好,但似乎有点人为。在这种特定情况下,确实为 dynlib
命名空间有一个类别是有意义的,但很容易找到让类别分布多个命名空间有意义的示例。在某些情况下,将所有不同的错误枚举放在一个唯一的命名空间中可能是有意义且实用的(例如 commons::errors
)。
关于c++ - 了解 C++11 中的 <system_error> 工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21821673/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!