Өзгөчө кырдаалдар жана каталарды иштетүү
Каталар жөнүндө таза кабарлаңыз, коопсуз калыбына келтириңиз жана объекттериңизди туруктуу абалда сактаңыз
throw кыласыз; андан кийин тил ылайыктуу catch табылганга чейин стекти чечет. Туура жасалса, бул коддун негизги ("бактылуу") жолун таза сактайт жана ката болгондо да ресурстар бошотулат.
throw,tryжанаcatchтуура колдоно аласыз жанаstd::exceptionтукумундагы объекттерди ыргыта аласыз,- стекти чечүүнү жана эмне үчүн так RAII өзгөчө кырдаалдарды коопсуз кылганын түшүндүрө аласыз,
- үч өзгөчө кырдаал коопсуздук кепилдиги (базалык, күчтүү, ыргытпоо) жөнүндө ой жүгүртүп, коддду
noexceptдеп белгилей аласыз, - качан өзгөчө кырдаалдарды колдонуп, качан ката коддорун (мисалы
std::optionalжеstd::error_code) тандоо керек экенин чече аласыз.
1. Эмне үчүн жөн эле ката кодун кайтарбаш керек?
Ар кандай олуттуу функция катага учурашы мүмкүн: файл ачылбайт, эстутум түгөнөт, колдонуучунун киргизген маалыматы маанисиз, тармактан окуу убакыт боюнча үзүлөт. Бул тууралуу чакыруучуга кабарлоонун эки негизги жолу бар.
- Ката коддору / өзгөчө маанилер: функция чакыруучу текшериши керек болгон атайын маани (
-1,nullptr,false,enum) кайтарат. - Өзгөчө кырдаалдар: функция объектти
throwкылат; кадимки аткаруу токтойт жана башкаруу иштетүүчүгө өтөт.
Ката коддорунун жаман жери - аларды этибарга албай коюу оңой. Чакыруучуну кайтарылган маанини карап турууга эч нерсе мажбурлабайт, ошондуктан унутулган текшерүү программаны тынч бузат. Дагы алар ар бир чакыруу ордун if текшерүүлөрү менен толтурат жана кайтаруу каналы жок жерден - мисалы конструктордон же перегрузкаланган оператордон - ката жөнүндө кабарлай албайт. Өзгөчө кырдаалдар муну чечет: иштетилбеген өзгөчө кырдаалды тынч жоготуп болбойт (анын ордуна программа токтойт), ал эми ката тиби өзү менен билдирүү алып жүрөт жана маалымат алып жүрө алат.