
2ã€ã®åºæ¬çãªæŠç¥ããããŸããä¿®æ£å¯èœãªãšã©ãŒïŒäŸå€ããšã©ãŒæ»ãã³ãŒãããã³ãã©ãŒé¢æ°ïŒã®åŠçãšå埩äžèœïŒ
assert()
ã
abort()
ïŒã§ãã æé©ãªæŠç¥ã¯ãã€ã§ããïŒ
ãšã©ãŒã®çš®é¡
ãšã©ãŒã¯ããŸããŸãªçç±ã§çºçããŸãããŠãŒã¶ãŒãå¥åŠãªããŒã¿ãå
¥åãããOSããã¡ã€ã«ãã³ãã©ãŒãæäŸã§ããªããã³ãŒãã
nullptr
éåç
§ãããªã©ã§ãã 説æãããŠããåãšã©ãŒã«ã¯ãåå¥ã®ã¢ãããŒããå¿
èŠã§ãã çç±ã«ããããšã©ãŒã¯3ã€ã®äž»èŠãªã«ããŽãªã«åé¡ãããŸãã
- ãŠãŒã¶ãŒãšã©ãŒïŒããã§ããŠãŒã¶ãŒãšã¯ãã³ã³ãã¥ãŒã¿ãŒã®åã«åº§ã£ãŠå®éã«ããã°ã©ã ãã䜿çšãããŠãã人ãæå³ããAPIãåŒãåºãããã°ã©ããŒã§ã¯ãããŸããã ãã®ãããªãšã©ãŒã¯ããŠãŒã¶ãŒãäœãééã£ãããšããããšçºçããŸãã
- OSãèŠæ±ãæºããããšãã§ããªãå Žåã ã·ã¹ãã ãšã©ãŒã衚瀺ãããŸãã ã€ãŸããã·ã¹ãã ãšã©ãŒã®åå ã¯ãã·ã¹ãã APIåŒã³åºãã®å€±æã§ãã ããã°ã©ããŒãã·ã¹ãã ã³ãŒã«ã«äžæ£ãªãã©ã¡ãŒã¿ãŒãæž¡ããããã«çºçãããã®ããããŸããããã¯ãã·ã¹ãã ãšã©ãŒã§ã¯ãªããããã°ã©ããŒã®ãšã©ãŒã§ãã
- ããã°ã©ããŒã®ãšã©ãŒã¯ãããã°ã©ããŒãAPIãŸãã¯ããã°ã©ãã³ã°èšèªã®åææ¡ä»¶ãèæ
®ããŠããªãå Žåã«çºçããŸãã APIãã
0
ãæåã®ãã©ã¡ãŒã¿ãŒãšããŠfoo()
ãåŒã³åºããªãããšãèŠæ±ããŠããå Žåãããã°ã©ããŒãéé£ããŸãã ãŠãŒã¶ãŒãfoo()
ã«æž¡ããã0
å
¥åããããã°ã©ããŒãå
¥åããŒã¿ã®ãã§ãã¯ãæžã蟌ãŸãªãã£ãå Žåãããã¯åã³åœŒã®ããã§ãã
説æãããŠãããšã©ãŒã®åã«ããŽãªã«ã¯ããã®åŠçã«å¯Ÿããç¹å¥ãªã¢ãããŒããå¿
èŠã§ãã
ã«ã¹ã¿ã ãšã©ãŒ
ç§ã¯éåžžã«å€§å£°ã§èšããŸãïŒãã®ãããªééãã¯æ¬åœã«ééãã§ã¯ãããŸããã
ãã¹ãŠã®ãŠãŒã¶ãŒãæç€ºã«åŸããªãã 人ã
ãå
¥åããããŒã¿ãæ±ãããã°ã©ããŒã¯ããããå
¥åãããã®ã¯æªãããŒã¿ã§ãããšæåŸ
ããªããã°ãªããŸããã ãããã£ãŠããŸããæå¹æ§ããã§ãã¯ããæ€åºããããšã©ãŒã«ã€ããŠãŠãŒã¶ãŒã«éç¥ããåå
¥åããããã«äŸé Œããå¿
èŠããããŸãã
ãããã£ãŠããŠãŒã¶ãŒã®ãšã©ãŒã«åŠçæŠç¥ãé©çšããŠãæå³ããããŸããã ãšã©ãŒãçºçããªãããã«ãå
¥åããŒã¿ã¯ã§ããã ãæ©ããã§ãã¯ããå¿
èŠããããŸãã
ãã¡ãããããã¯åžžã«å¯èœãšã¯éããŸããã å
¥åãæ€èšŒããã«ã¯é«ãããå Žåãããã°ãã³ãŒãã¢ãŒããã¯ãã£ã責任ã®åé¢ãè¡ããªãå ŽåããããŸãã ãã ãããã®ãããªå Žåããšã©ãŒã¯ä¿®æ£å¯èœãªãã®ãšããŠäžæã«æ±ãå¿
èŠããããŸãã ããã§ãªãå Žåã空ã®ããã¥ã¡ã³ãã§ããã¯ã¹ããŒã¹ãã¯ãªãã¯ããããã«ãªãã£ã¹ããã°ã©ã ãã¯ã©ãã·ã¥ãããšããŸãããããããªããšãçºå°ãããæŠåšãçºå°ããããšãããšã²ãŒã ãã¯ã©ãã·ã¥ããŸãã
ä¿®æ£å¯èœãªãšã©ãŒãåŠçããããã®æŠç¥ãšããŠäŸå€ã奜ãå Žåã¯ã泚æããŠãã ãããäŸå€ã¯
äŸå€çãªç¶æ³ã®ã¿ã察象ãšããŠããããŠãŒã¶ãŒã誀ã£ãããŒã¿ãå
¥åããã»ãšãã©ã®å Žåã¯å«ãŸããŸããã å®éãå€ãã®ã¢ããªã±ãŒã·ã§ã³ã«ãããšãããã¯æšæºã§ãããããŸãã äŸå€ã䜿çšãããã®ã¯ãã³ãŒã«ã¹ã¿ãã¯ã®æ·±éšïŒããããå€éšã³ãŒãïŒã§ããŸãã«çºçãããéåžžã«é倧ãªãŠãŒã¶ãŒãšã©ãŒãèŠã€ãã£ãå Žåã®ã¿ã§ãã ããã§ãªãå Žåã¯ãæ»ãã³ãŒãã䜿çšããŠãšã©ãŒãå ±åããããšããå§ãããŸãã
ã·ã¹ãã ãšã©ãŒ
éåžžãã·ã¹ãã ãšã©ãŒã¯äºæž¬ã§ããŸããã ããã«ããããã¯é決å®çã§ããã以åã¯åé¡ãªãåäœããŠããããã°ã©ã ã§çºçããå¯èœæ§ããããŸãã å
¥åããŒã¿ã®ã¿ã«äŸåãããŠãŒã¶ãŒãšã©ãŒãšã¯ç°ãªããã·ã¹ãã ãšã©ãŒã¯å®éã®ãšã©ãŒã§ãã
ããããããããã©ã®ããã«åŠçããŸãããã©ã®ããã«ä¿®æ£å¯èœãŸãã¯ä¿®æ£äžèœã§ããïŒ
ããã¯ç¶æ³ã«äŸåããŸãã
å€ãã®äººã
ã¯ãã¡ã¢ãªäžè¶³ãšã©ãŒã¯èŽåœçã ãšèããŠããŸãã å€ãã®å Žåããã®ãšã©ãŒãåŠçããããã«ãååãªã¡ã¢ãªããããŸããïŒ ãããŠãããã«å®è¡ãäžæããå¿
èŠããããŸãã
ããããOSããœã±ãããå²ãåœãŠãããšãã§ããªããšããäºå®ã«ããããã°ã©ã ã®ã¯ã©ãã·ã¥ã¯ãããŸããã¬ã³ããªãŒãªåäœã§ã¯ãããŸããã ãã®ãããäŸå€ãã¹ããŒãã
catch
ãŠããã°ã©ã ãåªããéããŠãã ããã
ãã ããäŸå€ãã¹ããŒããããšã¯åžžã«æ£ããéžæãšã¯éããŸããã
誰ãã圌ã
åžžã«ééã£ãŠãããšããèšãã§ãããã
倱æããåŸã«æäœãç¹°ãè¿ãããå Žåãã«ãŒãå
ã®
try-catch
ã§é¢æ°ãã©ããããã®ã¯
é
ã解決çã§ãã æ£ããéžæã¯ããšã©ãŒã³ãŒããè¿ããæ£ããå€ãè¿ããããŸã§ã«ãŒãããããšã§ãã
èªåå°çšã®APIåŒã³åºããäœæããå Žåã¯ãç¶æ³ã«åã£ããã¹ãéžæããŠããã«åŸã£ãŠãã ããã ãã ããã©ã€ãã©ãªãäœæããŠããå ŽåããŠãŒã¶ãŒãäœãæãã§ãããããããŸããã æ¬¡ã«ããã®ã±ãŒã¹ã«é©ããæŠç¥ãåæããŸãã èŽåœçãšãªãå¯èœæ§ã®ãããšã©ãŒã«ã¯ããšã©ãŒãã³ãã©ããé©ããŠããŸãããä»ã®ãšã©ãŒã«ã¯ãã€ãã³ããéçºããããã®2ã€ã®ãªãã·ã§ã³ãæäŸããå¿
èŠããããŸãã
ãããã°ã¢ãŒãã§ã®ã¿æå¹ã«ãªã£ãŠããã¢ãµãŒã·ã§ã³ã䜿çšããªãã§ãã ããã çµå±ããªãªãŒã¹ãã«ãã§ã·ã¹ãã ãšã©ãŒãçºçããå¯èœæ§ããããŸãïŒ
ããã°ã©ãã³ã°ãšã©ãŒ
ããã¯ææªã®çš®é¡ã®ãšã©ãŒã§ãã ããããåŠçããããã«ããšã©ãŒã颿°åŒã³åºããã€ãŸãäžé©åãªãã©ã¡ãŒã¿ãŒã«ã®ã¿é¢é£ä»ããããããã«ããŸãã ä»ã®ã¿ã€ãã®ããã°ã©ãã³ã°ãšã©ãŒã¯ãã³ãŒãå
šäœã«æ£ãã°ã£ãŠãããããã°ãã¯ãïŒã¢ãµãŒã·ã§ã³ãã¯ãïŒã䜿çšããŠãã©ã³ã¿ã€ã ã§ã®ã¿ãã£ããã§ããŸãã
äžé©åãªãã©ã¡ãŒã¿ã䜿çšããå Žåã2ã€ã®æŠç¥ããããŸããå
·äœçãªåäœãŸãã¯æªå®çŸ©ã®åäœãæå®ããŸãã
颿°ã®åæèŠä»¶ãäžæ£ãªãã©ã¡ãŒã¿ãŒãæž¡ãããšã®çŠæ¢ã§ããå Žåãããããæž¡ããšãããã¯æªå®çŸ©ã®åäœãšèŠãªããã颿°èªäœã§ã¯ãªããåŒã³åºãæŒç®åïŒåŒã³åºãå
ïŒã§ãã§ãã¯ããå¿
èŠããããŸãã 颿°ã¯ãããã°ã¢ãµãŒã·ã§ã³ã®ã¿ãè¡ãå¿
èŠããããŸãã
äžæ¹ãäžæ£ãªãã©ã¡ãŒã¿ãŒããªãããšãåæèŠä»¶ã®äžéšã§ã¯ãªããäžæ£ãªãã©ã¡ãŒã¿ãŒãæž¡ããšãã«é¢æ°ã
bad_parameter_exception
ãã¹ããŒããããšãããã¥ã¡ã³ããæ±ºå®ããŠããå Žåãæž¡ãããšã¯æç¢ºã«å®çŸ©ãããåäœã§ãïŒäŸå€ãŸãã¯
ä¿®æ£å¯èœãªãšã©ãŒãåŠçããããã®ä»ã®æŠç¥ãã¹ããŒããŸãïŒåžžã«ç¢ºèªããå¿
èŠããããŸãã
äŸãšããŠãã¢ã¯ã»ãµãŒé¢æ°
std::vector<T>
èããŸãã
operator[]
仿§ã¯ãã€ã³ããã¯ã¹ãæå¹ãªç¯å²å
ã«ããå¿
èŠããããšèšãã
at()
ã¯ãã€ã³ããã¯ã¹ãç¯å²å€ã ããã«ãã»ãšãã©ã®æšæºã©ã€ãã©ãªå®è£
ã¯ã
operator[]
ã€ã³ããã¯ã¹ããã§ãã¯ããããããã°ã¢ãŒããæäŸããŸãããæè¡çã«ã¯ããã¯æªå®çŸ©ã®åäœã§ããããã§ãã¯ããå¿
èŠã¯ãããŸããã
泚ïŒç¹å®ã®åäœãååŸããããã«äŸå€ãã¹ããŒããå¿
èŠã¯ãããŸããã 颿°ã®åææ¡ä»¶ã§èšåããããŸã§ãå®çŸ©æžã¿ãšèŠãªãããŸãã åææ¡ä»¶ã§èšè¿°ããããã®ã¯ãã¹ãŠã颿°ã«ãã£ãŠãã§ãã¯ãããã¹ãã§ã¯ãããŸãããããã¯æªå®çŸ©ã®åäœã§ãã
ãããã°ç¢ºèªã®å©ããåããŠã®ã¿ãã§ãã¯ããå¿
èŠããããšãããããŠãã€-åžžã«ã§ããïŒ
æ®å¿µãªãããæç¢ºãªã¬ã·ãã¯ãããŸããïŒæ±ºå®ã¯ç¹å®ã®ç¶æ³ã«äŸåããŸãã APIãéçºãããšãã«åŸãå®èšŒæžã¿ã®ã«ãŒã«ã¯1ã€ãããããŸããã ããã¯ãåŒã³åºãåŽã§ã¯ãªããåŒã³åºãåŽãããŒã¹ã©ã€ã³ããã§ãã¯ãããšãã芳å¯ã«åºã¥ããŠããŸãã ããã¯ãæ¡ä»¶ãåŒã³åºãå
ã«å¯ŸããŠãæ€èšŒå¯èœãã§ãªããã°ãªããªãããšãæå³ããŸãã ãŸãããã©ã¡ãŒã¿å€ãåžžã«æ£ããæäœãç°¡åã«å®è¡ã§ããå Žåãæ¡ä»¶ã¯ããã§ãã¯ããããŸãã ãã©ã¡ãŒã¿ã§ãããå¯èœãªå Žåãããã¯åææ¡ä»¶ã§ããã€ãŸãããããã°ã®ç¢ºèªã«ãã£ãŠã®ã¿ãã§ãã¯ãããŸãïŒãŸããé«ãããå Žåã¯ãŸã£ãããã§ãã¯ãããŸããïŒã
ããããæçµæ±ºå®ã¯ä»ã®å€ãã®èŠå ã«äŸåãããããäžè¬çãªã¢ããã€ã¹ãããããšã¯éåžžã«å°é£ã§ãã ããã©ã«ãã§ã¯ãæªå®çŸ©ã®åäœã«æžããã確èªã®ã¿ã䜿çšããããšããŸãã æšæºã©ã€ãã©ãªã
operator[]
ããã³
at()
è¡ãããã«ãäž¡æ¹ã®ãªãã·ã§ã³ãæäŸããããšãæšå¥šãããå ŽåããããŸãã
å Žåã«ãã£ãŠã¯ãããã¯ééããããããŸããã
std::exception
éå±€ã«ã€ããŠ
ä¿®æ£å¯èœãªãšã©ãŒãåŠçããããã®æŠç¥ãšããŠäŸå€ãéžæããå Žåã¯ãæ°ããã¯ã©ã¹ãäœæããæšæºã©ã€ãã©ãªã®äŸå€ã¯ã©ã¹ã®1ã€ããç¶æ¿ããããšããå§ãããŸãã
ãããã®4ã€ã®ã¯ã©ã¹ã®ãã¡1ã€ã ããç¶æ¿ããããšããå§ãããŸãã
std::bad_alloc
ïŒã¡ã¢ãªå²ãåœãŠã®å€±æãstd::runtime_error
ïŒäžè¬çãªã©ã³ã¿ã€ã ãšã©ãŒçšãstd::system_error
ïŒ std::runtime_error
ããæŽŸçïŒïŒãšã©ãŒã³ãŒããå«ãã·ã¹ãã ãšã©ãŒçšãstd::logic_error
ïŒç¹å®ã®åäœã䌎ãããã°ã©ãã³ã°ãšã©ãŒçšã
æšæºã©ã€ãã©ãªã¯ãè«çãšã©ãŒïŒã€ãŸããããã°ã©ããŒïŒãšã©ã³ã¿ã€ã ãšã©ãŒãåé¢ããããšã«æ³šæããŠãã ããã ã©ã³ã¿ã€ã ãšã©ãŒã¯ãã·ã¹ãã ãšã©ãŒãããåºãå®çŸ©ã§ãã ãããã°ã©ã ã®å®è¡äžã«ã®ã¿æ€åºããããšã©ãŒãã«ã€ããŠèª¬æããŸãã ãã®èšèé£ãã¯ããŸãæçã§ã¯ãããŸããã å人çã«ã¯ãããã°ã©ã ã®ãšã©ãŒã ãã§ãªãããŠãŒã¶ãŒã®é倱ã«ãã£ãŠãçºçããå¯èœæ§ã®ããäžè¯ãã©ã¡ãŒã¿ãŒã«äœ¿çšããŸãã ãã ããããã¯åŒã³åºãã¹ã¿ãã¯ã®å¥¥æ·±ãã§ã®ã¿å®çŸ©ã§ããŸãã ããšãã°ã
æšæºåœ¢åŒã®ã³ã¡ã³ãã®åœ¢åŒãäžé©åãªå Žåã
std::runtime_error
èµ·å ãã
std::runtime_error
äŸå€ãçºçã
std::runtime_error
ã ãã®åŸãé©åãªã¬ãã«ã§ãã£ããããããã°ã«èšé²ãããŸãã ãããã
std::logic_error
以å€ã§ã¯ãã®ã¯ã©ã¹ã䜿çšããŸããã
ãŸãšãããš
ãšã©ãŒãåŠçããã«ã¯2ã€ã®æ¹æ³ããããŸãã
- ä¿®æ£å¯èœ ïŒäŸå€ãŸãã¯æ»ãå€ã䜿çšãããŸãïŒç¶æ³/宿ã«å¿ããŠïŒã
- as fatal ïŒãšã©ãŒããã°ã«èšé²ãããããã°ã©ã ãäžæãããŸãã
è¬èŸã¯ããããã°ã¢ãŒãã§ã®ã¿ãèŽåœçãªãšã©ãŒåŠçæŠç¥ã®ç¹å¥ãªçš®é¡ã§ãã
ãšã©ãŒã«ã¯3ã€ã®äž»ãªåå ããããããããã«ç¹å¥ãªã¢ãããŒããå¿
èŠã§ãã
- ãŠãŒã¶ãŒãšã©ãŒã¯ãããã°ã©ã ã®äžäœã¬ãã«ã§ãšã©ãŒãšããŠæ±ãããã¹ãã§ã¯ãããŸããã ãŠãŒã¶ãŒãå
¥åãããã®ã¯ãã¹ãŠãããã«å¿ããŠãã§ãã¯ããå¿
èŠããããŸãã ããã¯ããŠãŒã¶ãŒãšçŽæ¥å¯Ÿè©±ããªãäžäœã¬ãã«ã§ã®ã¿ãšã©ãŒãšããŠæ±ãããšãã§ããŸãã ä¿®æ£å¯èœãªãšã©ãŒåŠçæŠç¥ãé©çšãããŸãã
- ã·ã¹ãã ãšã©ãŒã¯ãã¿ã€ããšé倧床ã«å¿ããŠã2ã€ã®æŠç¥ã®ããããã§åŠçã§ããŸãã ã©ã€ãã©ãªã¯å¯èœãªéãæè»ã§ãªããã°ãªããŸããã
- ããã°ã©ããŒã®ãšã©ãŒ ãã€ãŸãäžé©åãªãã©ã¡ãŒã¿ãŒã¯ãåææ¡ä»¶ã«ãã£ãŠçŠæ¢ãããå ŽåããããŸãã ãã®å Žåã颿°ã¯ãããã°ç¢ºèªã䜿çšããæ€èšŒã®ã¿ã䜿çšããå¿
èŠããããŸãã å®å
šã«å®çŸ©ãããåäœã«ã€ããŠè©±ããŠããå Žåã颿°ã¯èŠå®ã®æ¹æ³ã§ãšã©ãŒãå ±åããå¿
èŠããããŸãã ããã©ã«ãã§ã¯ãæªå®çŸ©ã®åäœã®ã·ããªãªã«åŸããåŒã³åºãåŽã§è¡ãã®ãå°é£ãããå Žåã«ã®ã¿ã颿°ã®ãã©ã¡ãŒã¿ãŒãã§ãã¯ãå®çŸ©ããããšããŸãã
C ++ã§ã®æè»ãªãšã©ãŒåŠçæè¡
æã«ã¯äœããæ©èœããªãããšããããŸãã ãŠãŒã¶ãŒãç¡å¹ãªåœ¢åŒã§ããŒã¿ãå
¥åãããšããã¡ã€ã«ãæ€åºãããããããã¯ãŒã¯æ¥ç¶ã倱æããã·ã¹ãã ã®ã¡ã¢ãªãäžè¶³ããŸãã ãããã¯ãã¹ãŠãšã©ãŒã§ãããåŠçããå¿
èŠããããŸãã
ããã¯ãé«ã¬ãã«é¢æ°ã§æ¯èŒçç°¡åã«å®è¡ã§ããŸãã äœããããŸããã
ãªãã£ãçç±ãæ£ç¢ºã«ç¥ã£ãŠãããããã«å¿ããŠå¯ŸåŠã§ããŸãã ããããäœã¬ãã«é¢æ°ã®å Žåããã¹ãŠãããã»ã©åçŽã§ã¯ãããŸããã 圌ãã¯
äœãæªãã®ããç¥ãã
ã倱æã®
äºå®ã®ã¿ãç¥ã£ãŠãããããã圌ãã«é»è©±ãã人ã«å ±åããªããã°ãªããŸããã
C ++ã«ã¯ããšã©ãŒæ»ãã³ãŒããšäŸå€ãšãã2ã€ã®äž»ãªã¢ãããŒãããããŸãã 仿¥ãäŸå€ã®äœ¿çšãåºãŸã£ãŠããŸãã ããããããŸããŸãªçç±ã§ã䜿çšã§ããªã/䜿çšã§ããªããšæã/䜿çšããããªããšèãã人ãããŸãã
ç§ã¯å³æ¹ããŸããã 代ããã«ãäž¡æ¹ã®ã¢ãããŒãã®æ¯æè
ãæºè¶³ããããã¯ããã¯ã説æããŸãã ç¹ã«ããã®ææ³ã¯ã©ã€ãã©ãªéçºè
ã«åœ¹ç«ã¡ãŸãã
åé¡
ç§ã¯
foonathan / memoryãããžã§ã¯ãã«åãçµãã§ããŸãã ãã®ãœãªã¥ãŒã·ã§ã³ã¯ããŸããŸãªã¢ãã±ãŒã¿ãŒã¯ã©ã¹ãæäŸããã®ã§ãäŸãšããŠå²ãåœãŠé¢æ°ã®æ§é ãèŠãŠã¿ãŸãããã
ç°¡åã«ããããã«ã
malloc()
ãŸãã å²ãåœãŠãããã¡ã¢ãªãžã®ãã€ã³ã¿ãè¿ããŸãã ã¡ã¢ãªå²ãåœãŠã倱æãããšã
nullptr
ãã€ãŸã
NULL
ãã€ãŸã誀ã£ãå€ã
NULL
ãŸãã
ãã®ãœãªã¥ãŒã·ã§ã³ã«ã¯æ¬ ç¹ããããŸãïŒ
malloc()
ãã¹ãŠã®åŒã³åºãããã§ãã¯ããå¿
èŠããããŸãã ãããå¿ããå Žåã¯ãååšããªãã¡ã¢ãªãå²ãåœãŠãŠãã ããã ããã«ãæ¬è³ªçã«ãšã©ãŒã³ãŒãã¯æšç§»çã§ãããšã©ãŒã³ãŒããè¿ãããšãã§ãã颿°ãåŒã³åºãããããç¡èŠãããåŠçãããã§ããªãå Žåã¯ããšã©ãŒã³ãŒããè¿ãå¿
èŠããããŸãã
ããã«ãããéåžžã®ã³ãŒãåå²ãšèª€ã£ãã³ãŒãåå²ã亀äºã«çºçããç¶æ³ã«ãªããŸãã ãã®å ŽåãäŸå€ãããé©åãªãœãªã¥ãŒã·ã§ã³ã«ãªããŸãã ãããã®ãããã§ãå¿
èŠãªãšãã«ã ããšã©ãŒãåŠçã§ããŸããããã§ãªãå Žåã¯ãåŒã³åºãå
ã«ãšã©ãŒãè¿ãã®ã¯éåžžã«éãã§ãã
ããã¯æ¬ ç¹ãšã¿ãªãããšãã§ããŸãã
ãããããã®ãããªç¶æ³ã§ã¯ãäŸå€ã«ã¯éåžžã«å€§ããªå©ç¹ããããŸããã¡ã¢ãªå²ãåœãŠé¢æ°ã¯æå¹ãªã¡ã¢ãªãè¿ããããŸã£ããäœãè¿ããŸããã ããã¯ãªãŒã«ãªã¢ããã·ã³ã°é¢æ°ã§ãããæ»ãå€ã¯åžžã«æå¹ã§ãã ããã¯ãScott Mayerã®ååã«ãããšãã
ã€ã³ã¿ãŒãã§ã€ã¹ã誀ã£ãŠäœ¿ãã«ããããæ£ãã䜿ããããããã«ãã ããšããæçšãªçµæã§ãã
äžèšãèãããšããšã©ãŒåŠçã¡ã«ããºã ãšããŠäŸå€ã䜿çšããå¿
èŠããããšäž»åŒµã§ããŸãã ãã®æèŠã¯ãç§ãå«ãã»ãšãã©ã®C ++éçºè
ã«ãã£ãŠå
±æãããŠããŸãã ããããç§ãè¡ã£ãŠãããããžã§ã¯ãã¯ãã¡ã¢ãªå²ãåœãŠããŒã«ãæäŸããã©ã€ãã©ãªã§ããããªã¢ã«ã¿ã€ã ã¢ããªã±ãŒã·ã§ã³åãã«èšèšãããŠããŸãã ãã®ãããªã¢ããªã±ãŒã·ã§ã³ã®ã»ãšãã©ã®éçºè
ïŒç¹ã«igrodelovïŒã«ãšã£ãŠãäŸå€ã®äœ¿çšã¯äŸå€ã§ãã
ãã³æ¢åµã
ãã®éçºè
ã°ã«ãŒããå°éããã«ã¯ãç§ã®ã©ã€ãã©ãªãŒãäŸå€ãªãè¡ãæ¹ãè¯ãã§ãã ããããç§ãšä»ã®å€ãã®äººã¯ãããã®åªé
ããšãšã©ãŒåŠçã®å®¹æãã®ããã«ãããã奜ãã®ã§ãä»ã®éçºè
ã®ããã«ãç§ã®ã©ã€ãã©ãªã¯äŸå€ã䜿ãã»ããè¯ãã§ãã
ããã§ã¯ã©ãããŸããïŒ
çæ³çãªãœãªã¥ãŒã·ã§ã³ïŒäŸå€ãèªç±ã«æå¹ããã³ç¡å¹ã«ããæ©èœã ãã ããäŸå€ã®æ§è³ªãèãããšããšã©ãŒã³ãŒããšäº€æããããšã¯ã§ããŸãããå
éšãšã©ãŒãã§ãã¯ã³ãŒãããªãããã§ãããã¹ãŠã®å
éšã³ãŒãã¯ãäŸå€ãééçã§ãããšããåæã«åºã¥ããŠããŸãã ãŸãããšã©ãŒã³ãŒããå
éšã§äœ¿çšãããäŸå€ã«å€æããããšããŠããäŸå€ã®å©ç¹ã®ã»ãšãã©ã奪ãããŠããŸããŸãã
幞ããªããšã«ãã¡ã¢ãªäžè¶³ãšã©ãŒãçºçãããšãã«äœããããã倿ã§ããŸããã»ãšãã©ã®å Žåããã®ã€ãã³ããèšé²ããŠããã°ã©ã ãäžæããŸãã ãã®ãããªç¶æ³ã§ã¯ãäŸå€ã¯åã«ãããã°ã©ã ãèšé²ããŠäžæããå¥ã®ã³ãŒãã«å¶åŸ¡ãæž¡ãæ¹æ³ã§ãã ããããå¶åŸ¡ãç§»ãããã®å€ããŠå¹ççãªæ¹æ³ããããŸãïŒé¢æ°ãã€ã³ã¿ãŒãã€ãŸããã³ãã©ãŒé¢æ°ã§ãã
äŸå€ãæå¹ã«ããŠããå Žåã¯ãããããã¹ããŒããŸãã ãã以å€ã®å Žåã¯ããã³ãã©ãŒé¢æ°ãåŒã³åºããŠããããã°ã©ã ãçµäºããŸãã ããã«ããã圹ã«ç«ããªã颿°ãæ©èœããªããªããããã°ã©ã ãæ£åžžã«å®è¡ãç¶ããããšãã§ããŸãã äžæããªãå Žåã颿°ã®å¿
é ã®äºåŸæ¡ä»¶ã«éåããŸããåžžã«æå¹ãªãã€ã³ã¿ãŒãè¿ããŸãã å®éããã®æ¡ä»¶ãæºãããããšãå¥ã®ã³ãŒãã®äœæ¥ãæ§ç¯ã§ããŸããå®éãããã¯æ£åžžãªåäœã§ãã
ç§ã¯ãã®ã¢ãããŒããäŸå€åŠçãšåŒã³ãã¡ã¢ãªãæäœãããšãã«ãããå®ããŸãã
解決ç1ïŒäŸå€ãã³ãã©ãŒ
æãäžè¬çãªåäœãããã°èšé²ãšäžæ¢ãã§ããå Žåã®æ¡ä»¶ã§ãšã©ãŒãåŠçããå¿
èŠãããå Žåã¯ãäŸå€ãã³ãã©ãŒã䜿çšã§ããŸãã ããã¯ãäŸå€ãªããžã§ã¯ããã¹ããŒãã代ããã«åŒã³åºããããã³ãã©ãŒé¢æ°ã§ãã æ¢åã®ã³ãŒãã§ãã£ãŠããå®è£
ã¯éåžžã«ç°¡åã§ãã ãããè¡ãã«ã¯ãäŸå€ã¯ã©ã¹ã«åŠçã³ã³ãããŒã«ãé
眮ãããã¯ãã§
throw
åŒãã©ããããŸãã
æåã«ãã¯ã©ã¹ã远å ãããã³ãã©é¢æ°ãæ§æããå Žåã«ãã£ãŠã¯ãªã¯ãšã¹ããã颿°ã远å ããŸãã æšæºã©ã€ãã©ãªã
std::new_handler
åŠçããã®ãšåãæ¹æ³ã§ãããè¡ãããšããå§ãã
std::new_handler
ã
class my_fatal_error { public:
ããã¯äŸå€ã¯ã©ã¹ã®ã¹ã³ãŒãå
ã«ãããããç¹å¥ãªæ¹æ³ã§ååãä»ããå¿
èŠã¯ãããŸããã ãŸããããã¯ç§ãã¡ã«ãšã£ãŠç°¡åã§ãã
äŸå€ãæå¹ãªå Žåãæ¡ä»¶ä»ãã³ã³ãã€ã«ã䜿çšããŠãã³ãã©ãŒãåé€ã§ããŸãã å¿
èŠã«å¿ããŠãå¿
èŠãªæ©èœãæäŸããéåžžã®æ··åã¯ã©ã¹ïŒmixinã¯ã©ã¹ïŒãäœæããŸãã
äŸå€ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãšã¬ã¬ã³ãã§ããçŸåšã®ãã³ãã©ãŒé¢æ°ãåŒã³åºãããã©ã¡ãŒã¿ãŒããå¿
èŠãªåŒæ°ãæž¡ããŸãã ãããŠããã®åŸã®
throw
ãã¯ããšçµåããŸãã
If```cpp #if EXCEPTIONS #define THROW(Ex) throw (Ex) #else #define THROW(Ex) (Ex), std::abort() #endif
> throw [foonathan/compatiblity](https:
äŸå€ãµããŒããæå¹ã«ããŠããå ŽåãäŸå€ãªããžã§ã¯ããäœæãããŠã¹ããŒãããŸãããã¹ãŠãéåžžã©ããã§ãã ãããããµããŒãããªãã«ãªã£ãŠããå Žåããšã«ããäŸå€ãªããžã§ã¯ããäœæãããŸã-ããã¯éèŠã§ã-ãã®åŸã®ã¿
std::abort()
åŒã³åºãããŸãã ãŸããã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãã³ãã©ãŒé¢æ°ãåŒã³åºããããå¿
èŠã«å¿ããŠæ©èœããŸãããšã©ãŒãã°ã®ãã¥ãŒãã³ã°ãã€ã³ããååŸããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒã®åŸã®
std::abort()
ã®åŒã³åºãã®ãããã§ããŠãŒã¶ãŒã¯äºåŸæ¡ä»¶ãç Žãããšãã§ããŸããã
ã¡ã¢ãªãæäœãããšããäŸå€ãæå¹ã«ãªã£ãŠãããšããäŸå€ãã¹ããŒããããšãã«åŒã³åºããããã³ãã©ããããŸãã
ãããã£ãŠããã®ææ³ã䜿çšãããšãäŸå€ããªãã«ããŠããããçšåºŠã®ã«ã¹ã¿ãã€ãºãåŒãç¶ã䜿çšã§ããŸãã , , , . , , .
?
. ?
â . , , . , .
: . , . , , , â .
, , .
. :
void* try_malloc(..., int &error_code) noexcept; void* malloc(...);
nullptr
error_code
.
nullptr
, . , :
void* malloc(...) { auto error_code = 0; auto res = try_malloc(..., error_code); if (!res) throw malloc_error(error_code); return res; }
, , . . , , (overload) .
, . , , . , .
2:
, . , .
, . â
nullptr
, â , .
,
errno
-
GetLastError()
!
,
std::optional
- .
(exception overload) â â , . , .
std::system_error
++ 11.
(non-portable)
std::error_code
, . ,
std::error_condition
.
. ,
std::error_code
. :
std::system_error
.
std::error_code
.
, -. â â , .
, . .
std::expected
, , , . , â .
!
â 4109 :
std::expected
. , . :
std::expected<void*, std::error_code> try_malloc(...);
std::expected
-null , â
std::error_code
. .
std::expected
.
ãããã«
, . : , â .
â . , , callback, . , . , . .
â , , . , , . : .