之前大概有寫過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