ในขณะที่ออกแบบไลบรารี C ++ 'จริงจัง' ครั้งแรกของฉันฉันถามตัวเอง:
มันเป็นสไตล์ที่ดีหรือไม่ที่จะได้รับการยกเว้นจากสิ่งstd::exception
นั้น
แม้หลังจากอ่านเสร็จ
ฉันยังไม่แน่ใจ เพราะนอกเหนือจากการปฏิบัติทั่วไป (แต่อาจจะไม่ดี) ฉันจะถือว่าในฐานะผู้ใช้ห้องสมุดว่าฟังก์ชั่นห้องสมุดจะstd::exception
แสดงเฉพาะเมื่อฟังก์ชั่นไลบรารีมาตรฐานล้มเหลวในการใช้งานไลบรารีและมันไม่สามารถทำอะไรได้เลย แต่ยังคงเมื่อเขียนรหัสโปรแกรมสำหรับฉันมันสะดวกมากและยัง IMHO std::runtime_error
ดูดีเพียงแค่โยน ผู้ใช้ของฉันยังสามารถพึ่งพาส่วนต่อประสานขั้นต่ำที่กำหนดเช่นwhat()
รหัสหรือ
และตัวอย่างเช่นผู้ใช้ของฉันให้ข้อโต้แย้งที่ผิดพลาดสิ่งที่จะสะดวกกว่าการโยน a std::invalid_argument
ใช่มั้ย ดังนั้นรวมกับการใช้งานยังร่วมกันของมาตรฐาน :: ข้อยกเว้นที่ฉันเห็นในรหัสผู้อื่น: ทำไมไม่ไปให้ดียิ่งขึ้นและได้รับมาจากชั้นยกเว้นของคุณเอง (เช่น lib_foo_exception) std::exception
และจาก
คิด?
lib_foo_exception
ชั้นเรียนของฉันมาจากstd::exception
ผู้ใช้ห้องสมุดจะจับlib_foo_exception
โดยเพียงแค่การจับstd::exception
นอกเหนือไปจากเมื่อเขาจับเพียงหนึ่ง libary ดังนั้นผมจึงยังสามารถขอควรห้องสมุดยกเว้นระดับรากมรดกของฉันจากมาตรฐาน :: ข้อยกเว้น
lib_foo_exception
" ด้วยการสืบทอดจากstd::exception
คุณสามารถทำมันด้วยหรือcatch(std::exception)
catch(lib_foo_exception)
โดยไม่ต้องเกิดจากการstd::exception
ที่คุณจะจับมันและถ้าหากcatch(lib_foo_exception)
โดย
catch(...)
เราเรียงลำดับของการละเว้น มันเป็นเพราะภาษาอนุญาตให้สำหรับกรณีที่คุณกำลังพิจารณา (และสำหรับห้องสมุด "ทำงานผิดปกติ") แต่นั่นไม่ใช่วิธีปฏิบัติที่ดีที่สุดที่ทันสมัย
catch
ไซต์ทั่วไปมากขึ้นและการทำธุรกรรม coarser ที่เหมือนกันซึ่งเป็นตัวอย่างการดำเนินการของผู้ใช้ หากคุณเปรียบเทียบกับภาษาที่ไม่สนับสนุนความคิดในการจับแบบทั่วไปstd::exception&
เช่นพวกเขามักจะมีรหัสมากขึ้นด้วยtry/catch
บล็อกตัวกลางที่เกี่ยวข้องกับข้อผิดพลาดที่เฉพาะเจาะจงมากซึ่งจะลดการจัดการข้อยกเว้นโดยทั่วไปเมื่อเริ่มต้น การเน้นหนักมากขึ้นในการจัดการข้อผิดพลาดด้วยตนเองและในข้อผิดพลาดที่แตกต่างกันทั้งหมดที่อาจเกิดขึ้น
std::exception
ไม่ได้หมายความว่าคุณโยนstd::exception
นอกจากนี้std::runtime_error
จะสืบทอดมาจากstd::exception
ในสถานที่แรกและwhat()
วิธีการมาจากการไม่ได้std::exception
และแน่นอนคุณควรสร้างคลาสยกเว้นของคุณเองแทนการขว้างปาข้อยกเว้นทั่วไปเช่นstd::runtime_error
std::runtime_error