0%

Define custom error_code in C++11

之前大概有寫過C++11 error_code的文章,不過覺得不夠清楚
這篇當作補充

定義Error

為了示範,僅定義幾個錯誤

1
2
3
4
5
#include <system_error>
enum class MyErrC {
FileNotFound = 1,
InvalidArgs
};

定義Error Category

定義Error的Domain,需要繼承自std::error_category,範例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MyErrCategory : std::error_category {
public:
const char* name() const noexcept override { return "MyErrCategory"; }
std::string message(int ev) const {
switch (static_cast<MyErrC>(ev)) {
case MyErrC::FileNotFound:
return "File not found";
case MyErrC::InvalidArgs:
return "Invalid Args";
default:
return "(unrecognized error)";
}
}
};

make_error_code

定義完Error Class和Category Class之後,就可以寫出make_error_code

1
2
3
4
5
std::error_code make_error_code(MyErrC e)
{
static const MyErrCategory category{};
return { static_cast<int>(e), category };
}

helper structure

不過就算這樣還是有點麻煩,我們希望寫出這樣的程式碼

1
std:error_code err = MyErrC::FileNotFound;

因此需要一個helper structure

1
2
3
4
5
namespace std
{
template <>
struct is_error_code_enum<MyErrC> : true_type {};
}

因此上面那行程式碼就能通過編譯了

Reference

Your own error code