ãŸããã
<system_error>
ãšãšã©ãŒåŠçã«ã€ããŠèª¬æããŠãããC ++ 0xã§ã®ã·ã¹ãã ãšã©ãŒãµããŒãããšããã¿ã€ãã«ã®æ¢ã«ããç¥ãããŠããäžé£ã®èšäºã翻蚳ãããã©ãããé·ãéèããŠããŸããã äžæ¹ã§ã¯ã2010å¹Žã«æžãããŠããã圌ãã¯åã«ç§ãæ»äœæå¥œå®¶ãšã¿ãªãããšãã§ãã仿¹ã§ã¯ãRuNetã«ã¯ãã®ãããã¯ã«é¢ããæ
å ±ãã»ãšãã©ãªããå€ãã®ããªãæè¿ã®èšäºã¯ãã®ãµã€ã¯ã«ãåç
§ããŠããããã®é¢é£æ§ã倱ããªãããšã瀺åããŠããŸãæ¥ã
ãã®ããããã®äœåãã¢ãã¬ã®
è±åŽå²©ã§æ°žç¶åããããšããå§ãããŸãã
翻蚳è
ã®çµéšããªããäžè¬çã«5æã®è±èªã¯åé¡ãªãããšãããã«èŠåããŸãã ãããŠæããã ã§ããããã§ããã°PMã§ã®ããªãã®æ¹å€ãšææ¡ã«åãã§ããŸãã
ããã§ã¯å§ããŸãããã
ããŒã1
ã¯ããã«
C ++ 0xã®æšæºã©ã€ãã©ãªã®æ°æ©èœã«ã¯ã
<system_error>
ãšããå°ããªããããŒãã¡ã€ã«ããããŸãã ã·ã¹ãã ãšã©ãŒãçªç¶ç®¡çããããã®ããŒã«ã»ãããæäŸããŸãã
å®çŸ©ãããŠããäž»ãªã³ã³ããŒãã³ãã¯æ¬¡ã®ãšããã§ãã
class error_category
class error_code
class error_condition
class system_error
enum class errc
ç§ã¯ãã®ã¢ãžã¥ãŒã«ã®èšèšã«æãæºããŠããã®ã§ãäžé£ã®èšäºã§ãå€èŠ³ãæŽå²ãããã³ãã®ã³ã³ããŒãã³ãã®äœ¿çšç®çã®çç±ã«ã€ããŠã話ããŸãã
å
¥æå
Boostã«ã¯ãå®å
šãªå®è£
ãšC ++ 03ã®ãµããŒããå«ãŸããŠããŸãã ããã¯ãããããçŸæç¹ã§ã®ç§»æ€æ§ã«é¢ããŠæãå®çžŸã®ããå®è£
ã ãšæããŸãã ãã¡ããã
std::
ã§ã¯ãªãã
boost::system::
ãšèšè¿°ããå¿
èŠããããŸãã
å®è£
ã¯
GCC 4.4以éã«å«ãŸããŠããŸãã ãã ããããã°ã©ã ã䜿çšããã«ã¯ã-std = c ++ 0xãªãã·ã§ã³ã䜿çšããŠããã°ã©ã ãã³ã³ãã€ã«ããå¿
èŠããããŸãã
æåŸã«ã
Microsoft Visual Studio 2010ã«ã¯ããããã®ã¯ã©ã¹ã®å®è£
ãå«ãŸããŠããŸã
[ãã ãå¶éããããŸã] ã äž»ãªå¶éã¯ã
system_category()
ãæå³ãããšããã«Win32ãšã©ãŒã衚瀺ããªãããšã§ãã ãããäœãæå³ãããã«ã€ããŠã®è©³çްã¯åŸè¿°ããŸãã
ïŒãããã¯ãç§ãç¥ã£ãŠããå®è£
ã«ãããªãããšã«æ³šæããŠãã ãããä»ã«ããããããããŸããïŒã
[翻蚳è
ã®ã¡ã¢ïŒãã¡ããããã®æ
å ±ã¯å€ããªã£ãŠããŸããããçŸåš<system_error>
ã¯ææ°ã®æšæºã©ã€ãã©ãªã®äžå¯æ¬ ãªéšåã§ã]çãã¬ãã¥ãŒ
以äžã¯ãäžèšã§
<system_error>
ã«å®çŸ©ãããŠããã¿ã€ããšã¯ã©ã¹ã§ãã
class error_category
åºæ¬ã¯ã©ã¹ããšã©ãŒã®ãœãŒã¹ãããã³ãšã©ãŒã³ãŒããšæ¡ä»¶ã®ã«ããŽãªã決å®ããããã«äœ¿çšãããŸããlass error_code
æäœïŒã·ã¹ãã ã³ãŒã«ãªã©ïŒã«ãã£ãŠè¿ãããç¹å®ã®ãšã©ãŒå€ã衚ããŸããclass error_condition
ã¯ãã³ãŒãã§ãã¹ãããå Žåã«ãã£ãŠã¯å¯Ÿå¿ããããã®ã§ããclass system_error
-throw / catchã䜿çšããŠãšã©ãŒãã¹ããŒããããšãã«error_code
ãã©ããããerror_code
ã«äœ¿çšãããäŸå€ãenum class errc
ã¯ãPOSIXããç¶æ¿ãããäžè¬çãªãšã©ãŒæ¡ä»¶ã®ã»ããã§ããis_error_code_enum<>, is_error_condition_enum<>, make_error_code, make_error_condition
ãšã©ãŒå€ãæã€åæãerror_code
ãŸãã¯error_condition
倿ããã¡ã«ããºã generic_category()
- errc
åºã¥ããŠãšã©ãŒã³ãŒããšæ¡ä»¶ãåé¡ããããã«äœ¿çšãããã«ããŽãªãªããžã§ã¯ããè¿ããŸããsystem_category()
-ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããçºçãã[åé¡]ãšã©ãŒã³ãŒãã«äœ¿çšãããã«ããŽãªãªããžã§ã¯ããè¿ããŸãã
åå
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãã¢ãžã¥ãŒã«ã®èšèšã§åŸã£ãåºæ¬ååã®ããã€ãããªã¹ãããŸãã ïŒæ®ãã®åå è
ã«ã€ããŠè©±ãããšã¯ã§ããŸããïŒã ã»ãšãã©ã®ãœãããŠã§ã¢ãããžã§ã¯ããšåæ§ã«ããããã®äžéšã¯æåããç®æšã§ãããäžéšã¯ããã»ã¹ã§çºçããŸããã
ãã¹ãŠã®ãšã©ãŒãäŸå€çã§ã¯ãããŸããã
ç°¡åã«èšãã°ãäŸå€ã¯åžžã«ãšã©ãŒãåŠçããæ£ããæ¹æ³ã§ã¯ãããŸããã ïŒäžéšã®ãµãŒã¯ã«ã§ã¯ããã®å£°æã¯ççŸããŠããŸããããã®çç±ã¯æ¬åœã«ããããŸãããïŒ
ããšãã°ããããã¯ãŒã¯ããã°ã©ãã³ã°ã§ã¯ã次ã®ãããªãšã©ãŒãçºçããŸãã
- ãªã¢ãŒãIPã¢ãã¬ã¹ã«æ¥ç¶ã§ããŸããã§ããã
- æ¥ç¶ãèœã¡ãŸããã
- IPv6ãœã±ãããéãããšããŸãããã䜿çšå¯èœãªIPv6ãããã¯ãŒã¯ã€ã³ã¿ãŒãã§ã€ã¹ããããŸããã
ãã¡ãããäŸå€çãªç¶æ³ã«ãªãããšããããŸãããéåžžã®å¶åŸ¡ãããŒã®äžéšãšããŠåæ§ã«åŠçã§ããŸãã ãããèµ·ãããšåççã«äºæ³ããå Žåãããã¯äŸå€ã§ã¯ãããŸããã ãããã£ãŠïŒ
- IPã¢ãã¬ã¹ã¯ããã¹ãåã«å¯Ÿå¿ããã¢ãã¬ã¹ã®ãªã¹ãã®1ã€ã«ãããŸããã ãªã¹ãå
ã®æ¬¡ã®ã¢ãã¬ã¹ã«æ¥ç¶ããŠã¿ãŸãã
- ãããã¯ãŒã¯ã¯ä¿¡é Œã§ããŸããã 忥ç¶ããŠãNåã®é害ãçºçããåŸã«ã ããããããããšããŸãã
- ããã°ã©ã ã¯ãIPv4ãœã±ããã®äœ¿çšã«æ»ãå ŽåããããŸãã
asioã®å Žåã®ãã1ã€ã®èŠä»¶ã¯ãéåææäœã®çµæãå®äºãã³ãã©ãŒã«æž¡ãæ¹æ³ã§ããã ãã®å Žåããšã©ãŒã³ãŒããã³ãŒã«ããã¯ãã³ãã©ãŒã®åŒæ°ã«ããå¿
èŠããããŸãã
ïŒå¥ã®ã¢ãããŒãã¯ãéåæ.NET
BeginXYZ/EndXYZ
.NETãã¿ãŒã³ãªã©ããã³ãã©ãŒå
ã§äŸå€ãåæ§ç¯ããææ®µãæäŸããããšã§ããç§ã®æèŠã§ã¯ããã®èšèšã¯è€éããå¢ããAPIã®ãšã©ãŒãèµ·ãããããããŸããïŒ
[翻蚳è
泚ïŒãã®ãããªããŒã«ã¯std::exception_ptr
C ++ 11ã®std::exception_ptr
ãªããŸãã]æåŸã«ãªããŸããããã³ãŒããµã€ãºãšããã©ãŒãã³ã¹ã®å¶éã«ãããäžéšã®é åã§ã¯äŸå€ã䜿çšã§ããŸããã
äžè¬ã«ãæèšçã§ã¯ãªããå®çšçã§ããå¿
èŠããããŸãã ãšã©ãŒã¡ã«ããºã ã䜿çšããããšã¯ãæç¢ºããæ£ç¢ºããå¶éãããã«ã¯å人çãªå¥œã¿ã®èгç¹ãããæé©ã§ãã å€ãã®å ŽåãäŸå€ãšãšã©ãŒã³ãŒãã倿ããããã®æ£ããåºæºã¯ããã®äœ¿ç𿹿³ã§ãã ããã¯ãã·ã¹ãã ãšã©ãŒã®è¡šçŸãäž¡æ¹ã®
[ãªãã·ã§ã³]ããµããŒãããå¿
èŠãããããšãæå³ã
ãŸã ã
ãšã©ãŒã¯ããã€ãã®ãœãŒã¹ããçºçããŸãã
C ++ 03æšæºã¯ããšã©ãŒã³ãŒãã®ãœãŒã¹ãšããŠerrnoãèªèããŸãã ããã¯ãstdio颿°ãäžéšã®æ°åŠé¢æ°ãªã©ã§äœ¿çšãããŸãã
POSIXãã©ãããã©ãŒã ã§ã¯ãå€ãã®ã·ã¹ãã æäœãerrnoã䜿çšããŠãšã©ãŒãéä¿¡ããŸãã POSIXã¯ããããã®ã±ãŒã¹ãã«ããŒããããã«è¿œå ã®errnoãšã©ãŒã³ãŒããå®çŸ©ããŠããŸãã
äžæ¹ãWindowsã¯Cæšæºã©ã€ãã©ãªä»¥å€ã§ã¯errnoã䜿çšãããWindows APIåŒã³åºãã¯éåžž
GetLastError()
ä»ããŠãšã©ãŒãå ±åããŸãã
ãããã¯ãŒã¯ããã°ã©ãã³ã°ã®èгç¹ã§ã¯ã颿°
getaddrinfo
ãã¡ããªã¯POSIXã§ç¬èªã®ãšã©ãŒã³ãŒãã»ããïŒEAI _...ïŒã䜿çšããŸãããWindowsã§ã¯
GetLastError()
åå空éãå
±æããŸãã ä»ã®ã©ã€ãã©ãªïŒSSLãæ£èŠè¡šçŸãªã©ïŒãçµ±åããããã°ã©ã ã§ã¯ãä»ã®ã«ããŽãªã®ãšã©ãŒã³ãŒããçºçããŸãã
ããã°ã©ã ã¯ããããã®ãšã©ãŒã³ãŒããäžè²«ããæ¹æ³ã§ç®¡çã§ããå¿
èŠããããŸãã ç¹ã«ãæäœãçµã¿åãããŠé«ã¬ãã«ã®æœè±¡åãäœæã§ãã
[æ¹æ³]ã«èå³ããããŸãã ã·ã¹ãã ã³ãŒã«ã
getaddrinfo
ãSSLãããã³æ£èŠè¡šçŸã1ã€ã®APIã«çµã¿åãããŠããã®APIã®ãŠãŒã¶ãŒã«ãšã©ãŒã³ãŒãã®çš®é¡ã®ãççºããåŠçãããããšã¯ã§ããŸããã ãã®ãšã©ãŒã®æ°ãããœãŒã¹ããã®APIã®å®è£
ã«è¿œå ããŠããã€ã³ã¿ãŒãã§ãŒã¹ã¯å€æŽãããŸããã
ã«ã¹ã¿ã æ¡åŒµæ©èœ
æšæºã©ã€ãã©ãªã®ãŠãŒã¶ãŒã¯ãç¬èªã®ãšã©ãŒãœãŒã¹ã远å ã§ããå¿
èŠããããŸãã ãã®æ©èœã¯ãåã«ãµãŒãããŒãã£ã®ã©ã€ãã©ãªãçµ±åããããã«äœ¿çšã§ããŸãããããé«ãã¬ãã«ã®æœè±¡åãäœæããããšããæ¬²æ±ãšãé¢é£ããŠããŸãã HTTPãªã©ã®ãããã³ã«ã®å®è£
ãéçºãããšããRFCã§å®çŸ©ãããŠãããšã©ãŒã«å¯Ÿå¿ããäžé£ã®ãšã©ãŒã³ãŒãã远å ã§ããããã«ããããšèããŠããŸãã
å
ã®ãšã©ãŒã³ãŒããä¿åãã
ããã¯ç§ã®æåã®ç®æšã®1ã€ã§ã¯ãããŸããã§ãããæšæºã¯ããç¥ãããäžé£ã®ãšã©ãŒã³ãŒããæäŸãããšèããŸããã ã·ã¹ãã æäœããšã©ãŒãè¿ããå Žåãã©ã€ãã©ãªã¯ãšã©ãŒãæ¢ç¥ã®ã³ãŒãã«å€æããå¿
èŠããããŸãïŒãã®ãããªãããã³ã°ãæå³ããªãå ŽåïŒã
幞ããªããšã«ã誰ããç§ã®ã¢ãããŒãã®åé¡ãææããŠãããŸããã ãšã©ãŒã³ãŒãã®ç¿»èš³ã¯æ
å ±ããªã»ããããŸããã¡ã€ã³ã·ã¹ãã ã³ãŒã«ã«ãã£ãŠè¿ããããšã©ãŒã¯å€±ãããŸãã ããã¯ãããã°ã©ã 管çãããŒã®èгç¹ããã¯ããã»ã©éèŠã§ã¯ãªããããããŸããããããã°ã©ã ã®ãµããŒãã«ãšã£ãŠéåžžã«éèŠã§ãã ããã°ã©ããŒãæšæºåããããšã©ãŒã³ãŒãããã°ãšãã¬ãŒã¹ã«äœ¿çšããããšã¯çãã®äœå°ããªããåæãšã©ãŒã¯åé¡ã®èšºæã«äžå¯æ¬ ã§ãã
ãã®æåŸã®ååã¯ã第2éšã®ããŒãã§ãã
error_code
vs
error_condition
ãŸãã é£çµ¡ãåãåããŸãããã
ããŒã2
error_code vs error_condition
C ++ 0xæšæºã®1000ããŒãžä»¥äžãããã«ãžã¥ã¢ã«ãªèªè
ã¯1ã€ã®ããšã«æ°ä»ãã¯ãã§ãïŒerror_codeãšerror_conditionã¯ã»ãšãã©åäžã«èŠããŸãïŒ äœãèµ·ãã£ãŠããã®ïŒ ãããã¯å¿ã®ãªãã³ããŒïŒããŒã¹ãã®çµæã§ããïŒ
éèŠãªã®ã¯ãããªããããã§äœããããã§ãã
ããäžåºŠãæåã®éšåã§èª¬æããå
容ãèŠãŠã¿ãŸãããã
lass error_code
æäœïŒã·ã¹ãã ã³ãŒã«ãªã©ïŒã«ãã£ãŠè¿ãããç¹å®ã®ãšã©ãŒå€ã衚ããŸããclass error_condition
ã¯ãã³ãŒãã§ãã¹ãããå Žåã«ãã£ãŠã¯å¯Ÿå¿ããããã®ã§ãã
ã¯ã©ã¹ã¯ç®çãç°ãªããããã¯ã©ã¹ã¯ç°ãªããŸãã äŸãšããŠã
create_directory()
ãšããä»®æ³é¢æ°ãèããŠã¿ãŸãããã
void create_directory ( const std::string & pathname, std::error_code & ec );
次ã®ããã«åŒã³åºããŸãïŒ
std::error_code ec; create_directory("/some/path", ec);
æäœã¯ãããŸããŸãªçç±ã§å€±æããå ŽåããããŸããããšãã°ã
- æš©å©ã¯å¿
èŠãããŸããã
- ãã£ã¬ã¯ããªã¯ãã§ã«ååšããŸãã
- ãã¹ãé·ãããŸãã
- 芪ãã¹ãååšããŸããã
倱æã®åå ãäœã§ããã
create_directory()
颿°ãå¶åŸ¡ãè¿ããšã
ec
倿°ã«ã¯OSåºæã®ãšã©ãŒã³ãŒããå«ãŸããŸãã äžæ¹ãåŒã³åºããæåããå Žåã
ec
ã¯ãŒãå€ããããŸãã ããã¯ããŒããæåã瀺ããä»ã®å€ããšã©ãŒã瀺ãå ŽåãäŒçµ±ãžã®ãªããŒãžã¥ã§ãïŒerrnoããã³
GetLastError()
䜿çšãããŸã
GetLastError()
ã
æäœãæåããã倱æãããã ãã«é¢å¿ãããå Žåã¯ã
error_code
ç°¡åã«
bool
ã«å€æããããšããäºå®ã䜿çšã§ããŸãã
std::error_code ec; create_directory("/some/path", ec); if(!ec) {
ãã ããããã£ã¬ã¯ããªãæ¢ã«ååšããããšã©ãŒã確èªããããšã«èå³ããããšããŸãã ãã®ãšã©ãŒãçºçããå Žåãä»®æ³ããã°ã©ã ãåŒãç¶ãæ©èœããå¯èœæ§ããããŸãã ãããå®è£
ããŠã¿ãŸãããã
std::error_code ec; create_directory("/some/path", ec); if(ec.value() == EEXIST)
ãã®ã³ãŒãã¯ééã£ãŠããŸãã POSIXãã©ãããã©ãŒã ã§å©çãåŸãããšãã§ããŸããã
ec
ã«ã¯ãã©ãããã©ãŒã åºæã®ãšã©ãŒãå«ãŸããããšãå¿ããªãã§ãã ããã Windowsã§ã¯ãã»ãšãã©ã®å Žåããšã©ãŒã¯
ERROR_ALREADY_EXISTS
ãªããŸãã ïŒããã«æªãããšã«ãã³ãŒãã¯ãšã©ãŒã³ãŒãã«ããŽãªããã§ãã¯ããŸããããããã«ã€ããŠã¯åŸã§èª¬æããŸããïŒ
çµéšåïŒ error_code::value()
ãåŒã³åºããšãäœãééã£ãããšãããŠããããšã«ãªããŸãã
ãããã£ãŠããã©ãããã©ãŒã
EEXIST
ãšã©ãŒ
ã³ãŒã ïŒ
EEXIST
ãŸãã¯
ERROR_ALREADY_EXISTS
ïŒããããããã
[ãã©ãããã©ãŒã ã«äŸåããªã]ãšã©ãŒ
æ¡ä»¶ ïŒããã£ã¬ã¯ããªã¯æ¢ã«ååšããŸããïŒã«ãããã³ã°ããŸãã ã¯ããããã§ãã
error_condition
ãå¿
èŠ
error_condition
ã
error_codeãšerror_conditionã®æ¯èŒ
ããã¯ã
error_condition
ãªããžã§ã¯ããš
error_condition
ãªããžã§ã¯ããæ¯èŒããå ŽåïŒã€ãŸãã==æŒç®åãŸãã¯ïŒ=æŒç®åã䜿çšããå ŽåïŒã«çºçããŸãã
error_code
ããã³error_code
å®å
šäžèŽããã§ãã¯ãããŸããerror_condition
ããã³error_condition
å®å
šäžèŽããã§ãã¯ãããŸããerror_code
ããã³error_condition
åçæ§ããã§ãã¯ãããŸãã
ãã©ãããã©ãŒã
ec
ãšã©ãŒã³ãŒãããããã£ã¬ã¯ããªãæ¢ã«ååšããããšã©ãŒã衚ã
error_condition
ãªããžã§ã¯ããšæ¯èŒããå¿
èŠãããããšãæããã«ãªã£ãããšãé¡ã£ãŠããŸãã ãã®å Žåã®ããã«ãC ++ 0xã¯
std::errc::file_exists
æäŸããŸãã ã€ãŸããæ¬¡ã®ããã«æžãå¿
èŠããããŸãã
std::error_code ec; create_directory("/some/path", ec); if(std::errc::file_exists == ec) ...
ããã¯ãæšæºã©ã€ãã©ãªã®éçºè
ããšã©ãŒã³ãŒã
EEXIST
ãŸãã¯
ERROR_ALREADY_EXISTS
ãšãšã©ãŒæ¡ä»¶
std::errc::file_exists
åçæ§ãå®çŸ©ããããã«æ©èœããŸãã åŸã§ã察å¿ããåçã®å®çŸ©ã䜿çšããŠç¬èªã®ãšã©ãŒã³ãŒããšæ¡ä»¶ã远å ããæ¹æ³ã瀺ããŸãã
ïŒæ£ç¢ºã«ã¯ã
std::errc::file_exists
ã¯ã
enum class errc
åæå€ã®1ã€ã§ããçŸæç¹ã§ã¯ãåæããã
std::errc::*
å€ã
error_condition
宿°ã®ã©ãã«ãšèããå¿
èŠããããŸããæ¬¡ã®ããŒãã§ã¯ããã®ä»çµã¿ã説æããŸããïŒ
確èªã§ããæ¡ä»¶ã¯ã©ã®ããã«ããŠããããŸããïŒ
C ++ 0xã®ããã€ãã®æ°ããã©ã€ãã©ãªé¢æ°ã«ã¯ããšã©ãŒæ¡ä»¶ã»ã¯ã·ã§ã³ããããŸãã ãããã®ã»ã¯ã·ã§ã³ã«ã¯ã
error_condition
宿°ãšãåçã®ãšã©ãŒã³ãŒããçæãããæ¡ä»¶ããªã¹ããããŠããŸãã
ã¡ãã£ãšããæŽå²
å
ã®
error_code
ã¯ã©ã¹ã¯ããã¡ã€ã«ã·ã¹ãã ã©ã€ãã©ãªãšãããã¯ãŒã¯ã©ã€ãã©ãªã®è£å©ã³ã³ããŒãã³ããšããŠTR2ã«ææ¡ãããŸããã ãã®èšèšã§ã¯ã
error_code
ãã©ãããã©ãŒã åºæã®ãšã©ãŒã«å¯Ÿå¿ããããã«ã
error_code
宿°ãå®è£
ãããŸããã äžèŽãäžå¯èœãªå ŽåããŸãã¯è€æ°ã®äžèŽãããå Žåãã©ã€ãã©ãªå®è£
ã¯ãã©ãããã©ãŒã åºæã®ãšã©ãŒãæšæºã®
error_code
ãŸãã
é»åã¡ãŒã«ã®ãã£ã¹ã«ãã·ã§ã³ã§ãå
ã®ãšã©ãŒã³ãŒããä¿æããããšã®äŸ¡å€ã«ã€ããŠåŠã³ãŸããã ãã®åŸã
generic_error
ã¯ã©ã¹ã®ãããã¿ã€ããäœæãããŸããããç§ã«ã¯åããŠããŸããã§ããã
generic_error
ååã
error_condition
ã«å€æŽãããšãæºè¶³ã®ãã解決çãèŠã€ãããŸããã ç§ã®çµéšã§ã¯ãããŒãã³ã°ã¯ã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ã§æãé£ããåé¡ã®1ã€ã§ãããé©åãªååãéžæããããšãäž»ãªä»äºã§ãã
次ã®ããŒãã§ã¯ã
enum class errc
ã
error_condition
ã®å®æ°ã»ãããšããŠæ©èœãããã¡ã«ããºã ãèŠãŠ
error_condition
ãŸãã
ããŒã3
ã¯ã©ã¹å®æ°ãšããŠã®åæå€
èŠãŠããããã«ãããããŒãã¡ã€ã«
<system_error>
ã¯ã次ã®ããã«
class enum errc
ãå®çŸ©ããŠããŸãã
enum class errc { address_family_not_supported, address_in_use, ... value_too_large, wrong_protocol_type, };
åæå€ã¯
error_condition
宿°ã§ãïŒ
std::error_code ec; create_directory("/some/path", ec); if(std::errc::file_exists == ec) ...
æããã«ã
errc
ãã
errc
ãžã®æé»çãªå€æã¯ãåäžã®åŒæ°ã³ã³ã¹ãã©ã¯ã¿ãŒã§ããã§äœ¿çšãããŸãã ã·ã³ãã«ã ããïŒ
ããã»ã©åçŽã§ã¯ãããŸããã
ç©äºãããå°ãè€éã«ããããã€ãã®çç±ããããŸãã
- åæå€ã¯ãšã©ãŒèªäœã瀺ããŸããã
error_condition
ãæ§ç¯ããã«ã¯ããšã©ãŒã®ã«ããŽãªãç¥ã£ãŠããå¿
èŠããããŸãã <system_error>
ã¢ãžã¥ãŒã«ã¯ãã«ããŽãªã䜿çšããŠè€æ°ã®ãšã©ãŒãœãŒã¹ããµããŒãããŸãã ã«ããŽãªã¯ã error_code
ãšerror_condition
äž¡æ¹ã®å±æ§ã§ãã - ãªããžã§ã¯ãã¯æ¡åŒµå¯èœã§ãªããã°ãªããŸããã ã€ãŸãããŠãŒã¶ãŒïŒããã³æšæºã©ã€ãã©ãªã®å°æ¥ã®æ¡åŒµæ©èœïŒã¯ãç¬èªã®å®æ°ãå®çŸ©ã§ããå¿
èŠããããŸãã
- ãªããžã§ã¯ãã¯ã
error_code
ãšerror_condition
äž¡æ¹ã®å®æ°ããµããŒãããå¿
èŠããããŸãã enum class errc
ã¯error_condition
ã«ã®ã¿å®æ°ãæäŸããŸãããä»ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ã error_code
åã®å®æ°ãå¿
èŠã«ãªãå ŽåããããŸãã - æåŸã«ãåæå€ãã
error_code
ãŸãã¯error_condition
ãžã®æç€ºçãªå€æããµããŒãããå¿
èŠããããŸãã ç§»æ€ãããããã°ã©ã ã¯ã std::errc::*
ããç¶æ¿ãããšã©ãŒã³ãŒããçæããå¿
èŠãããå ŽåããããŸãã
ãã®ãããæ¬¡ã®è¡ãæ£ããã®ã¯äºå®ã§ãã
if(std::errc::file_exists == ec)
æé»çã«
error_condition
ãã
errc
ã«å€æãããããã«ããã€ãã®ã¹ãããããããŸãã
ã¹ããã1ïŒåæãããå€ããšã©ãŒã³ãŒããæ¡ä»¶ãã倿ãã
åæåãç»é²ããã«ã¯ã2ã€ã®ãã³ãã¬ãŒãã䜿çšãããŸãã
template<class T> struct is_error_code_enum: public false_type {}; template<class T> struct is_error_condition_enum: public false_type {};
is_error_code_enum<>
ã䜿çšããŠåãç»é²ãããšãæé»çã«
error_code
倿ã§ããŸãã åæ§ã«ã
is_error_condition_enum<>
ã䜿çšããŠåãç»é²ããå Žåãæé»çã«
error_condition
倿ã§ããŸãã ããã©ã«ãã§ã¯ãåã¯å€æãªãã§ç»é²ãããŸãïŒãããã£ãŠãäžèšã®
false_type
䜿çšããŸãïŒãã
enum class errc
次ã®ããã«ç»é²ãããŸãã
template<> struct is_error_condition_enum<errc>: public true_type {};
æé»çãªå€æã¯ãæ¡ä»¶ä»ãã§èš±å¯ããã倿ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŠå®è¡ãããŸãã ããã¯ãããã
SFINAEã䜿çšããŠå®è£
ãããŸãããç°¡åã«ããããã«æ¬¡ã®ããã«èããå¿
èŠããããŸãã
class error_condition { ...
ãããã£ãŠãç§ãã¡ãæžããšãïŒ
if(std::errc::file_exists == ec)
ã³ã³ãã€ã©ã¯ã次ã®2ã€ã®ãªãŒããŒããŒãããéžæããŸãã
bool operator == ( const error_code & a, const error_code & b ); bool operator == ( const error_code & a, const error_condition & b );
圌ã¯åŸè
ãéžæããŸããããã¯ã
error_condition
倿ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšå¯èœã§ããã
error_code
䜿çšã§ããªãããã§ãã
ã¹ããã2ïŒãšã©ãŒå€ããšã©ãŒã«ããŽãªã«äžèŽããã
error_condition
ãªããžã§ã¯ãã«ã¯ãå€ãšã«ããŽãªã®2ã€ã®å±æ§ãå«ãŸããŠããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒã«å°éããã®ã§ãã³ã³ã¹ãã©ã¯ã¿ãŒãé©åã«åæåããå¿
èŠããããŸãã
ããã¯ã
make_error_condition()
颿°ãåŒã³åºãã³ã³ã¹ãã©ã¯ã¿ãŒã®ãããã§å®çŸããŸãã
ã«ã¹ã¿ã æ¡åŒµã®å¯èœæ§ã¯ã
ADLã¡ã«ããºã ã䜿çšããŠå®è£
ãããŸãã ãã¡ããã
errc
ã¯
std
ãADLã¯åãå Žæã§
make_error_condition()
ãèŠã€ã
std
ã
make_error_condition()
ã®å®è£
ã¯ç°¡åã§ãïŒ
error_condition make_error_condition(errc e) { return error_condition ( static_cast<int>(e), generic_category() ); }
ã芧ã®ãšããããã®é¢æ°ã¯2ã€ã®åŒæ°ãæã€
error_condition
ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŠããšã©ãŒå€ãšã«ããŽãªãŒã®äž¡æ¹ãæç€ºçã«æå®ããŸãã
ïŒæ£ããç»é²ãããåæåã®ïŒ
error_code
倿ã³ã³ã¹ãã©ã¯ã¿ãŒ
error_code
å ŽåãåŒã³åºããã颿°ã¯
make_error_code()
ãŸãã ãã以å€ã®å Žåã
error_code
ãš
error_condition
æ§é ã¯åãã§ãã
error_codeãŸãã¯error_conditionãžã®æç€ºçãªå€æ
error_code
ã¯äž»ã«ãã©ãããã©ãŒã åºæã®ãšã©ãŒã§äœ¿çšããããšãç®çãšããŠããŸãããç§»æ€å¯èœãªã³ãŒãã¯
errc
åæå€ãã
error_code
ãäœæãã
error_code
ããããŸãã ãã®ããã[颿°]
make_error_code(errc)
ããã³
make_error_condition(errc)
ãŸãã ããŒã¿ãã«ã³ãŒãã§ã¯ã次ã®ããã«äœ¿çšã§ããŸãã
void do_foo(std::error_code & ec) { #if defined(_WIN32)
ããå°ãæŽå²
æåã¯ã
<system_error>
error_code
宿°ããªããžã§ã¯ããšããŠå®çŸ©ãããŠããŸããã
extern error_code address_family_not_supported; extern error_code address_in_use; ... extern error_code value_too_large; extern error_code wrong_protocol_type;
LWGã¯ã倿°ã®ã°ããŒãã«ãªããžã§ã¯ãã®ã³ã¹ããå¿é
ãã代æ¿ãœãªã¥ãŒã·ã§ã³ãèŠæ±ããŸããã
constexpr
ã®äœ¿çšãæ€èšããŸãããã
<system_error>
ä»ã®ããã€ãã®åŽé¢ãšäºææ§ã
constexpr
ãŸããã ãããã£ãŠã䜿çšå¯èœãªæè¯ã®èšèšã§ãããããåæããã®å€æã®ã¿ãæ®ããŸããã
次ã«ãç¬èªã®ãšã©ãŒã³ãŒããšæ¡ä»¶ã远å ããæ¹æ³ã瀺ããŸãã
ããŒã4
ã«ã¹ã¿ã ãšã©ãŒã³ãŒããäœæãã
æåã®éšåã§è¿°ã¹ãããã«ã
<system_error>
ååã®1ã€ã¯æ¡åŒµæ§ã§ãã
ããã¯ãä»èª¬æããã¡ã«ããºã ã䜿çšããŠãç¬èªã®ãšã©ãŒã³ãŒããç¹å®ã§ããããšãæå³ããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯ãäœãããå¿
èŠããããã説æããŸããåäœäŸã®åºç€ãšããŠãHTTPã©ã€ãã©ãªãäœæããŠããŠãHTTPã¹ããŒã¿ã¹ã³ãŒãã«å¯Ÿå¿ãããšã©ãŒãå¿
èŠã§ãããšããŸããã¹ããã1ïŒãšã©ãŒå€ã決å®ãã
æåã«ããšã©ãŒå€ã®ã»ãããå®çŸ©ããå¿
èŠããããŸããC ++ 0xã䜿çšããå Žåã¯ãclass enum
åæ§ã®ãã®ã䜿çšã§ããŸãstd::errc
ã enum class http_error { continue_request = 100, switching_protocols = 101, ok = 200, ... gateway_timeout = 504, version_not_supported = 505 };
ãšã©ãŒã«ã¯ãHTTPã¹ããŒã¿ã¹ã³ãŒãã«åŸã£ãŠå€ãå²ãåœãŠãããŸãããã®éèŠæ§ã¯ããšã©ãŒã³ãŒãã®äœ¿çšã«é¢ããŠæããã«ãªããŸããã©ã®å€ãéžæããŠãããšã©ãŒã«ã¯ãŒã以å€ã®å€ãå¿
èŠã§ããããªããæãåºãããã«ããªããžã§ã¯ã<system_error>
ã¯ããŒããæåãæå³ããèŠåã䜿çšããŸããããŒã¯ãŒããããããããããšã«ãããéåžžã®ïŒã€ãŸããC ++ 03äºæïŒã䜿çšã§ããŸããenum
class
enum http_error { ... };
æ³šïŒ æåã®ãã®ãåæãããå€ã®ååãã¯ã©ã¹ã¹ã³ãŒãã§å²ããšããäºå®ãšã¯class enum
ç°ãªãenum
ãŸã[2çªç®ã¯ããããã°ããŒãã«ã¹ã³ãŒãã«ãã¹ããŒãããŸã]ãåæå€ã«ã¢ã¯ã»ã¹ããã«ã¯ãäŸãã°ãã¯ã©ã¹ã®ååãæå®ããå¿
èŠããããŸãhttp_error::ok
ãéåžženum
ã®åå空é[ namespace
]ã§ã©ããããããšã«ããããã®åäœããšãã¥ã¬ãŒãã§ããŸãã namespace http_error { enum http_error_t { ... }; }
ãã®äŸã®æ®ãã§ã¯ãã䜿çšããŸãenum class
ãåå空éã®ã¢ãããŒãã¯ãèªè
ã®èª²é¡ãšããŠæ®ããŸãã[翻蚳è
泚ïŒå®éã«ã¯ãç¯å²ãç°ãªãã ãã§ãªãenum class
ãåæå€ããä»ã®åãžã®æé»çãªå€æãçŠæ¢ãããŠããŸã]ã¹ããã2ïŒã¯ã©ã¹error_categoryãå®çŸ©ãã
ãªããžã§ã¯ãerror_code
ã¯ããšã©ãŒå€ãšã«ããŽãªã§æ§æãããŸãããšã©ãŒã«ããŽãªã¯ããã®åæå€ã®å
·äœçãªæå³ãå®çŸ©ããŸããããšãã°ã100ã¯http_error::continue_request
ãããã³std::errc::network_down
ïŒLinuxã§ã¯ENETDOWNïŒã®äž¡æ¹ãæå³ããå ŽåããããŸããæ°ããã«ããŽãªãäœæããã«ã¯ã次ããã¯ã©ã¹ãç¶æ¿ããå¿
èŠããããŸãerror_category
ã class http_category_impl: public std::error_category { public: virtual const char * name() const; virtual std::string message(int ev) const; };
çŸæç¹ã§ã¯ããã®ã¯ã©ã¹ã¯çŽç²ãªä»®æ³é¢æ°ã®ã¿ãå®è£
ããŸãerror_category
ãã¹ããã3ïŒã«ããŽãªãŒã«äººéãèªããååãä»ãã
ä»®æ³é¢æ°error_category::name()
ã¯ãã«ããŽãªãèå¥ããæååãè¿ãå¿
èŠããããŸãã const char * http_category_impl::name() const { return "http"; }
ãã®ååã¯ããšã©ãŒã³ãŒããã«æžã蟌ããšãã«ã®ã¿äœ¿çšããããããå®å
šã«äžæã§ããå¿
èŠã¯ãããŸããstd::ostream
ããã ãããã®ããã°ã©ã ã®ãã¬ãŒã ã¯ãŒã¯å
ã§äžæã«ããããšãæãŸããã§ããããã¹ããã4ïŒãšã©ãŒã³ãŒããæååã«å€æãã
ãã®é¢æ°error_category::message()
ã¯ããšã©ãŒå€ãããã説æããæååã«å€æããŸãã std::string http_category_impl::message(int ev) const { switch(ev) { case http_error::continue_request: return "Continue"; case http_error::switching_protocols: return "Switching protocols"; case http_error::ok: return "OK"; ... case http_error::gateway_timeout: return "Gateway time-out"; case http_error::version_not_supported: return "HTTP version not supported"; default: return "Unknown HTTP error"; } }
颿°ãåŒã³åºããšãã«error_code::message()
ãerror_code
ä»åºŠã¯ããšã©ãŒã¡ãã»ãŒãžãååŸããã«ã¯ãåè¿°ã®ä»®æ³é¢æ°ã®åå ãšãªããŸãããããã®ãšã©ãŒã¡ãã»ãŒãžã¯èªå·±å®çµåã§ãªããã°ãªããªãããšã«æ³šæããŠãã ããã远å ã®ã³ã³ããã¹ãã䜿çšã§ããªãããã°ã©ã ã®ãã®æç¹ã§ãããããïŒããšãã°ããã°ãã¡ã€ã«ã«ïŒæžã蟌ãããšãã§ããŸãããæ¿å
¥ããšã©ãŒã¡ãã»ãŒãžã䜿çšããæ¢åã®APIãã©ããããå Žåãç¬èªã®ã¡ãã»ãŒãžãäœæããå¿
èŠããããŸããããšãã°ãHTTP APIãã¡ãã»ãŒãžæååã䜿çšããå Žåã"HTTP version %d.%d not supported"
åçã®ãªãã©ã€ã³ã¡ãã»ãŒãžã¯ã«ãªããŸã"HTTP version not supported"
ãã¢ãžã¥ãŒã«<system_error>
ãããã®ã¡ãã»ãŒãžã®ããŒã«ã©ã€ãºã«é¢ããŠã¯äœã®å©ããæäŸããŸãããæšæºã©ã€ãã©ãªã®ãšã©ãŒã«ããŽãªããã®ã¡ãã»ãŒãžã¯ãçŸåšã®ãã±ãŒã«ã«åºã¥ããŠããå¯èœæ§ããããŸããããã°ã©ã ã§ããŒã«ã©ã€ãºãå¿
èŠãªå Žåã¯ãåãã¢ãããŒãã䜿çšããããšããå§ãããŸããïŒå°ãæŽå²ïŒ LWGã¯ããŒã«ã©ã€ãºã®å¿
èŠæ§ãèªèããŠããŸããããããŒã«ãªãŒãŒã·ã§ã³ãšæ¡åŒµæ§ãååã«äžèŽãããèšèšã¯ãããŸããã§ãããã¹ããã5ïŒäžæã®ã«ããŽãªèå¥
ç¶æ¿ããããªããžã§ã¯ãã®èå¥åã¯ãerror_category
ãã®ã¢ãã¬ã¹ã«ãã£ãŠæ±ºãŸããŸããããã¯ãããªããæžããšãïŒ const std::error_category & cat1 = ...; const std::error_category & cat2 = ...; if(cat1 == cat2) ...
æ¡ä»¶if
ã¯ã次ã®ããã«è©äŸ¡ãããŸãã if(&cat1 == &cat2) ...
æšæºã©ã€ãã©ãªã«ãã£ãŠèšå®ãããäŸã«åŸã£ãŠãã«ããŽãªãªããžã§ã¯ããžã®ãªã³ã¯ãè¿ã颿°ãæäŸããå¿
èŠããããŸãã const std::error_category & http_category();
ãã®é¢æ°ã¯ãåžžã«åããªããžã§ã¯ããžã®åç
§ãè¿ãå¿
èŠããããŸãããããè¡ã1ã€ã®æ¹æ³ã¯ããœãŒã¹ã³ãŒããã¡ã€ã«ã§ã°ããŒãã«ãªããžã§ã¯ããå®çŸ©ãããããžã®ãªã³ã¯ãè¿ãããšã§ãã http_category_impl http_category_instance; const std::error_category & http_category() { return http_category_instance; }
ãã ããã°ããŒãã«å€æ°ã¯ã¢ãžã¥ãŒã«éã®åæåé åºã§åé¡ãåŒãèµ·ãããŸããå¥ã®ã¢ãããŒãã¯ãããŒã«ã«ã®éç倿°ã䜿çšããããšã§ãïŒ const std::error_category & http_category() { static http_category_impl instance; return instance; }
ãã®å Žåãã«ããŽãªãªããžã§ã¯ãã¯æåã®äœ¿çšæã«åæåãããŸããC ++ 0xã¯ãåæåãã¹ã¬ããã»ãŒãã§ããããšãä¿èšŒããŸããïŒC ++ 03ã¯ãã®ãããªä¿èšŒãäžããŸããã§ããïŒãå±¥æŽïŒèšèšã®åææ®µéã§ã¯ãæŽæ°ãŸãã¯æååã䜿çšããŠã«ããŽãªãèå¥ããããšãæ€èšããŸããããã®ã¢ãããŒãã®äž»ãªåé¡ã¯ãæ¡åŒµæ§ãšçµã¿åãããäžææ§ã確ä¿ããããšã§ãããã«ããŽãªãæŽæ°ãŸãã¯æååã§èå¥ãããå Žåã2ã€ã®ç¡é¢ä¿ãªã©ã€ãã©ãªéã®è¡çªãé²ãã«ã¯ã©ãããã°ããã§ããïŒãªããžã§ã¯ãIDã䜿çšãããšãç°ãªãã«ããŽãªãåãIDãæã€ããšãé²ãããã«ãªã³ã«ãŒã掻çšãããŸããããã«ãåºæ¬ã¯ã©ã¹ãžã®ãã€ã³ã¿ãŒãä¿åããããšã§ãerror_codesã倿
æ§ã«ããäžæ¹ã§ãããããã³ããŒå¯èœãªå€åãšããŠä¿æã§ããŸããã¹ããã6ïŒåæåããerror_codeããã«ããã
ããŒã3ã§ç€ºããããã«ãå®è£
ã§<system_error>
ã¯make_error_code()
ããšã©ãŒå€ãã«ããŽãªã«é¢é£ä»ããããã«ååãæã€é¢æ°ãå¿
èŠã§ããHTTPãšã©ãŒã®å Žåããã®é¢æ°ã¯æ¬¡ã®ããã«ãªããŸãã std::error_code make_error_code(http_error e) { return std::error_code ( static_cast<int>(e), http_category() ); }
å®å
šãæãããã«ãbuildãšåçã®é¢æ°ãæäŸããå¿
èŠããããŸãerror_condition
ã std::error_condition make_error_condition(http_error e) { return std::error_condition ( static_cast<int>(e), http_category() ); }
å®è£
ã§<system_error>
ã¯ADLã䜿çšããŠãããã®é¢æ°ãæ€åºãããããtypeãšåãåå空éã«é
眮ããå¿
èŠããããŸãhttp_error
ãæé 7ïŒæé»çã«error_codeã«å€æããããã®æžã蟌ã¿
åæå€http_error
ã宿°ãšããŠerror_code
䜿çšããã«ã¯ããã³ãã¬ãŒãã䜿çšããŠå€æã³ã³ã¹ãã©ã¯ã¿ãŒãæå¹ã«ããŸãis_error_code_enum
ã namespace std { template<> struct is_error_code_enum<http_error>: public true_type {}; }
ã¹ããã8ïŒãªãã·ã§ã³ïŒïŒããã©ã«ãã®ãšã©ãŒæ¡ä»¶ãå€å¥ãã
説æãããšã©ãŒã®äžéšã«ã¯ãããã®åæ§ã®ãšã©ãŒæ¡ä»¶ãå«ãŸããŠããå ŽåããããŸãerrc
ãããšãã°ãHTTP 403 Forbiddenã¹ããŒã¿ã¹ã³ãŒãã¯ãšåãæå³std::errc::permission_denied
ã§ããä»®æ³é¢æ°ãerror_category::default_error_condition()
䜿çšãããšãç¹å®ã®ãšã©ãŒã³ãŒãã«çžåœãããšã©ãŒæ¡ä»¶ãå®çŸ©ã§ããŸããïŒåçæ§ã®å®çŸ©ã«ã€ããŠã¯ã第2éšã§èª¬æããŸãããïŒHTTPãšã©ãŒã®å Žåãæ¬¡ã®ããã«èšè¿°ã§ããŸãã class http_category_impl: private std::error_category { public: ... virtual std::error_condition default_error_condition(int ev) const; }; ... std::error_condition http_category_impl::default_error_condition(int ev) const { switch(ev) { case http_error::forbidden: return std::errc::permission_denied; default: return std::error_condition(ev, *this); } }
ãã®ä»®æ³é¢æ°ãåå®çŸ©ããªãããšã«æ±ºããå Žåerror_condition
ããšåããšã©ãŒãšã«ããŽãªã«ãªããŸãerror_code
ãäžèšã®äŸã®ããã«ããããããã©ã«ãã®åäœã§ãããšã©ãŒã³ãŒãã䜿çšãã
ããã§ããšã©ãŒãèšå®ãããšãã®ããã«ãåæå€http_error
ã宿°ãšããŠäœ¿çšã§ãerror_code
ãŸãã void server_side_http_handler ( ..., std::error_code & ec ) { ... ec = http_error::ok; }
ãããŠããããã§ãã¯ãããšãïŒ std::error_code ec; load_resource("http://some/url", ec); if(http_error::ok == ec) ...
[翻蚳è
ã®ã¡ã¢ïŒãã®å®è£
ã§ã¯ãäžèšã®ååã¯æ©èœããŸãã-ãŒãå€=æå-ããããããã£ã¹ãbool
ãæ©èœããŸãã]ãšã©ãŒå€ã¯HTTPã¹ããŒã¿ã¹ã³ãŒãã«åºã¥ããŠããããerror_code
ãå¿çããçŽæ¥èšå®ããããšãã§ããŸãïŒ std::string load_resource ( const std::string & url, std::error_code & ec ) {
ããã«ããã®ã¡ãœããã䜿çšããŠãæ¢åã®ã©ã€ãã©ãªã«ãã£ãŠçæããããšã©ãŒãã©ããã§ããŸããæåŸã«ãæé 8ã§ç䟡é¢ä¿ã決å®ããå Žåãæ¬¡ã®ããã«èšè¿°ã§ããŸãã std::error_code ec; data = load_resource("http://some/url", ec); if(std::errc::permission_denied == ec) ...
ãšã©ãŒç¶æ
ã®æ£ç¢ºãªåå ãç¥ãå¿
èŠã¯ãããŸãããããŒã2ã§èª¬æãhttp_error::forbidden
ãããã«ãæ
å ±ã倱ãããªãããã«ãå
ã®ãšã©ãŒã³ãŒãïŒããšãã°ãïŒãä¿åãããŸããæ¬¡ã®ããŒãã§ã¯ãäœæããã³äœ¿ç𿹿³ã瀺ããŸãerror_condition
ãããŒã5
ã«ã¹ã¿ã ãšã©ãŒæ¡ä»¶ã®äœæ
ã¢ãžã¥ãŒã«ã®æ¡åŒµæ§ã¯<system_error>
ãšã©ãŒã³ãŒãã«éå®ããããæ¡åŒµããerror_condition
ããšãã§ããŸããç¬èªã®ãšã©ãŒæ¡ä»¶ãäœæããçç±
ãã®è³ªåã«çããããã«ãã®ã¯ééãã«æ»ã£ãŠã¿ããerror_code
ãšerror_condition
ãlass error_code
-æäœïŒã·ã¹ãã ã³ãŒã«ãªã©ïŒã«ãã£ãŠè¿ãããç¹å®ã®ãšã©ãŒå€ã衚ããŸããclass error_condition
-ã³ãŒãã§ç¢ºèªããå Žåã«ãã£ãŠã¯å¯Ÿå¿ããããã®ã
ããã¯ãã«ã¹ã¿ã ãšã©ãŒæ¡ä»¶ã®ããã€ãã®ãŠãŒã¹ã±ãŒã¹ãæäŸããŸãã以äžã«ç€ºãããã«ãå®çŸ©ã¯å®çŸ©ã«error_condition
䌌ãŠããŸãerror_code
ãã¹ããã1ïŒãšã©ãŒå€ã決å®ãã
enum
åæ§ã«ããšã©ãŒå€ãäœæããå¿
èŠããããŸãstd::errc
ã enum class api_error { low_system_resources = 1, ... name_not_found, ... no_such_entry };
䜿çšããå®éã®å€ã¯éèŠã§ã¯ãããŸããããããããç°ãªã£ãŠããŠãŒã以å€ã§ããããšã確èªããå¿
èŠããããŸããã¹ããã2ïŒã¯ã©ã¹error_categoryãå®çŸ©ãã
ãªããžã§ã¯ãerror_condition
ã¯ããšã©ãŒå€ãšã«ããŽãªã§æ§æãããŸããæ°ããã«ããŽãªãäœæããã«ã¯ã次ããã¯ã©ã¹ãç¶æ¿ããå¿
èŠããããŸãerror_category
ã class api_category_impl: public std::error_category { public: virtual const char * name() const; virtual std::string message(int ev) const; virtual bool equivalent(const std::error_code & code, int condition) const; };
ã¹ããã3ïŒã«ããŽãªãŒã«äººéãèªããååãä»ãã
ä»®æ³é¢æ°error_category::name()
ã¯ãã«ããŽãªãèå¥ããæååãè¿ãå¿
èŠããããŸãã const char * api_category_impl::name() const { return "api"; }
ã¹ããã4ïŒãšã©ãŒç¶æ
ãæååã«å€æãã
ãã®é¢æ°error_category::message()
ã¯ããšã©ãŒå€ãããã説æããæååã«å€æããŸãã std::string api_category_impl::message(int ev) const { switch(ev) { case api_error::low_system_resources: return "Low system resources"; .. } }
ãã ãããŠãŒã¹ã±ãŒã¹ã«ãã£ãŠã¯ãåŒã³åºãerror_condition::message()
ãçºçããå¯èœæ§ã¯äœããªããŸãããã®å Žåãç¥èªã䜿çšããŠæ¬¡ã®ããã«æžãããšãã§ããŸãã std::string api_category_impl::message(int ev) const { return "api error"; }
ã¹ããã5ïŒãšã©ãŒç䟡ãå®è£
ãã
ä»®æ³é¢æ°ã¯error_category::equivalent()
ããšã©ãŒã³ãŒããšæ¡ä»¶ã®ç䟡æ§ã倿ããããã«äœ¿çšãããŸãããã®æ©èœã«ã¯2ã€ã®ãªãŒããŒããŒãããããŸããæåã®ãã®ïŒ
virtual bool equivalent(int code, const error_condition & condition) const;
error_code
çŸåšã®ã«ããŽãªãšä»»æã®éã§åçæ§ã確ç«ããããã«äœ¿çšãããŸãerror_condition
ã2çªç®ã®ãªãŒããŒããŒãïŒ virtual bool equivalent(const error_code & code, int condition) const;
error_condition
çŸåšã®ã«ããŽãªãšä»»æã®ã®éã®ç䟡æ§ãå®çŸ©ããŸãerror_code
ããšã©ãŒæ¡ä»¶ãäœæããŠããããã2çªç®ã®ãªãŒããŒããŒãããªãŒããŒã©ã€ãããå¿
èŠããããŸããåçæ§ã®å®çŸ©ã¯åçŽã§ããæ¡ä»¶ãšåçã«ãtrue
ããerror_code
å Žåã¯returnãããã§ãªãå Žåã¯return false
ã§ãããã©ãããã©ãŒã åºæã®ãšã©ãŒãç¡èŠããå Žåã¯error_category::equivalent()
ãæ¬¡ã®ããã«å®è£
ã§ããŸãã bool api_category_impl::equivalent(const std::error_code & code, int condition) const { switch(condition) { ... case api_error::name_not_found: #if defined(_WIN32) return code == std::error_code(WSAEAI_NONAME, system_category()); #else return code == std::error_code(EAI_NONAME, getaddrinfo_category()); #endif ... default: return false; } }
ïŒæããã«ãgetaddrinfo_category()
ã©ããã§å®çŸ©ããå¿
èŠããããŸããïŒãã§ãã¯ã¯è€éã«ãªãå¯èœæ§ããããä»ã®å®æ°ãåå©çšããããšãã§ããŸãerror_condition
ã bool api_category_impl::equivalent(const std::error_code & code, int condition) const { switch(condition) { case api_error::low_system_resources: return code == std::errc::not_enough_memory || code == std::errc::resource_unavailable_try_again || code == std::errc::too_many_files_open || code == std::errc::too_many_files_open_in_system; ... case api_error::no_such_entry: return code == std::errc::no_such_file_or_directory; default: return false; } }
ã¹ããã6ïŒäžæã®ã«ããŽãªèå¥
ã«ããŽãªãªããžã§ã¯ããžã®åç
§ãè¿ã颿°ãå®çŸ©ããå¿
èŠããããŸãã const std::error_category & api_category();
åžžã«åããªããžã§ã¯ããžã®åç
§ãè¿ããŸãããšã©ãŒã³ãŒããšåæ§ã«ãã°ããŒãã«å€æ°ã䜿çšã§ããŸãã api_category_impl api_category_instance; const std::error_category & api_category() { return api_category_instance; }
ãŸãã¯ãC ++ 0xã®éçã¹ã¬ããã»ãŒã倿°ã䜿çšã§ããŸãã const std::error_category & api_category() { static api_category_impl instance; return instance; }
ã¹ããã7ïŒåæåããerror_conditionãæ§ç¯ãã
å®è£
ã§<system_error>
ã¯make_error_code()
ããšã©ãŒå€ãã«ããŽãªã«é¢é£ä»ããããã«ååãæã€é¢æ°ãå¿
èŠã§ãã std::error_condition make_error_condition(api_error e) { return std::error_condition ( static_cast<int>(e), api_category() ); }
å®å
šãæãããã«ãbuildãšåçã®é¢æ°ãå®çŸ©ããå¿
èŠããããŸãerror_code
ãããã¯èªè
ã®ããã®æŒç¿ãšããŠæ®ããŠãããŸããã¹ããã8ïŒerror_conditionãžã®æé»çãªå€æã®ããã®æžã蟌ã¿
æåŸã«ãåæå€api_error
ã宿°ãšããŠäœ¿çšã§ããããã«error_condition
ããã³ãã¬ãŒãã䜿çšããŠå€æã³ã³ã¹ãã©ã¯ã¿ãŒãæå¹ã«ãis_error_condition_enum
ãŸãã namespace std { template<> struct is_error_condition_enum<api_error>: public true_type {}; }
ãšã©ãŒæ¡ä»¶ã䜿çšãã
ããã§ãåæå€api_error
ã宿°error_condition
ãšããŠäœ¿çšã§ããã»ããæ¬¡ã§å®çŸ©ãããå€ã䜿çšã§ããŸãstd::errc
ã std::error_code ec; load_resource("http://some/url", ec); if(api_error::low_system_resources == ec) ...
äœåºŠãèšã£ãããã«ãå
ã®ãšã©ãŒã³ãŒãã¯ä¿åãããæ
å ±ã¯å€±ãããŸããããã®ãšã©ãŒã³ãŒãã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããã®ãã®ããç¬èªã®ãšã©ãŒã«ããŽãªãæã€HTTPã©ã€ãã©ãªããã®ãã®ãã¯é¢ä¿ãããŸããããšã«ãããã«ã¹ã¿ã ãšã©ãŒæ¡ä»¶ãåæ§ã«æ©èœããå¯èœæ§ããããŸããæ¬¡ã®ãããããæåŸã®éšåã§ãã䜿çšããAPIã®äœææ¹æ³ã説æããŸã<system_error>
ãããšãã
æ®å¿µãªãããèè
ã®çŽæã«ãããããããäžé£ã®èšäºã¯å®æããŠããŸããã§ãããæ¬¡ã®éšåã¯åºãŠããŸããã§ããããããŠãããã¯åºãŠããå¯èœæ§ã¯äœãã§ãã