ฉันมักจะชอบจัดการข้อยกเว้นภายใน (เช่นลอง / ยกเว้นภายในฟังก์ชันที่เรียกว่าอาจส่งคืนค่า None) เนื่องจาก python ถูกพิมพ์แบบไดนามิก โดยทั่วไปแล้วฉันคิดว่าเป็นการเรียกการตัดสินไม่ทางใดก็ทางหนึ่ง แต่ในภาษาที่พิมพ์แบบไดนามิกมีปัจจัยเล็ก ๆ น้อย ๆ ที่ช่วยให้เครื่องชั่งน้ำหนักไม่ผ่านข้อยกเว้นไปยังผู้โทร:
- ใครก็ตามที่เรียกใช้ฟังก์ชันของคุณจะไม่ได้รับแจ้งถึงข้อยกเว้นที่สามารถโยนทิ้งได้ มันกลายเป็นรูปแบบศิลปะเล็กน้อยที่จะรู้ว่าคุณกำลังตามล่าหาข้อยกเว้นประเภทใด (และทั่วไปยกเว้นบล็อกควรหลีกเลี่ยง)
if val is None
ง่ายกว่าexcept ComplicatedCustomExceptionThatHadToBeImportedFromSomeNameSpace
เล็กน้อย อย่างจริงจังฉันเกลียดที่ต้องจำไว้ว่าให้พิมพ์from django.core.exceptions import ObjectDoesNotExist
ที่ด้านบนของไฟล์ django ทั้งหมดของฉันเพื่อจัดการกับกรณีการใช้งานทั่วไปจริงๆ ในโลกที่มีการพิมพ์แบบคงที่ให้ตัวแก้ไขจัดการแทนคุณ
อย่างไรก็ตามจริงๆแล้วมันเป็นการเรียกร้องการตัดสินเสมอและสถานการณ์ที่คุณกำลังอธิบายซึ่งฟังก์ชันที่เรียกว่าได้รับข้อผิดพลาดที่ไม่สามารถช่วยได้เป็นเหตุผลที่ดีเยี่ยมในการเพิ่มข้อยกเว้นที่มีความหมายอีกครั้ง คุณมีความคิดที่ถูกต้อง แต่เว้นแต่คุณจะมีข้อยกเว้นจะให้ข้อมูลที่มีความหมายมากกว่าในการติดตามสแต็ก
AttributeError: 'NoneType' object has no attribute 'foo'
ซึ่งเก้าครั้งในสิบครั้งคือสิ่งที่ผู้โทรจะเห็นว่าคุณส่งคืนโดยไม่ได้รับการจัดการใด ๆ ไม่ต้องกังวล
(ทั้งหมดนี้ทำให้ฉันหวังว่าข้อยกเว้น python จะมีcause
แอตทริบิวต์โดยค่าเริ่มต้นเช่นเดียวกับใน java ซึ่งช่วยให้คุณสามารถส่งผ่านข้อยกเว้นไปยังข้อยกเว้นใหม่เพื่อให้คุณสามารถสร้างใหม่ทั้งหมดที่คุณต้องการและไม่สูญเสียแหล่งที่มาเดิมของปัญหา)