ในขณะที่ออกแบบไลบรารี 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_errorstd::runtime_error