ฉันมีฟังก์ชั่นที่สามารถคืนหนึ่งในสามสิ่ง:
- สำเร็จ (
True) - ความล้มเหลว (
False) - ข้อผิดพลาดในการอ่าน / การแยกสตรีม (
None)
คำถามของฉันคือถ้าฉันไม่ควรทดสอบTrueหรือFalseฉันจะดูได้อย่างไรว่าผลลัพธ์คืออะไร ด้านล่างเป็นวิธีที่ฉันทำอยู่ในปัจจุบัน:
result = simulate(open("myfile"))
if result == None:
print "error parsing stream"
elif result == True: # shouldn't do this
print "result pass"
else:
print "result fail"
มันง่ายพอ ๆ กับการถอดชิ้น== Trueส่วนออกหรือว่าฉันควรจะเพิ่ม tri-bool data-type ฉันไม่ต้องการให้simulateฟังก์ชันโยนข้อยกเว้นเนื่องจากฉันต้องการให้โปรแกรมภายนอกทำโดยมีข้อผิดพลาดคือบันทึกและดำเนินการต่อ
simulateฟังก์ชั่นฉันจับทุกข้อยกเว้น; ฉันไม่ต้องการให้สิ่งใดที่เกิดขึ้นภายในเครื่องจำลองหยุดการทำงานของโปรแกรมที่เหลือ (และประมวลผลองค์ประกอบถัดไป) แต่คำตอบนั้นทำให้ฉันเปลี่ยนใจ
simulateมีสิ่งที่สามารถจับและลองใหม่ได้ดี แต่ถ้ามันว่า "ล้มเหลว" Noneก็ไม่ควรกลับมา มันควรเพิ่มข้อยกเว้นให้กับสคริปต์ที่เรียกมันว่า ไม่ว่าจะด้วยวิธีใดsimulateก็ตาม การกลับมาNoneไม่ได้มีประโยชน์เท่ากับการสร้างข้อยกเว้นที่เหมาะสม - หรืออนุญาตให้มีข้อยกเว้นเพื่อเผยแพร่ผ่านsimulateไปยังสคริปต์การโทรสำหรับการจัดการ
except Exception:แทน นี้จับความผิดพลาด "ของจริง" พร้อมด้วยและWarning StopIterationมันช่วยให้KeyboardInterruptและSystemExitผ่านแม้ว่า หากคุณต้องการจับสิ่งเหล่านั้นจริง ๆ ก็น่าจะดีที่สุดที่จะใช้ตัวอื่นลองนอก / ยกเว้นหรือโครงสร้างอื่น ๆ ที่แสดงถึงเจตนาของคุณอย่างชัดเจนเนื่องจากสิ่งเหล่านั้นไม่ใช่ "ข้อผิดพลาด" ( แต่ผมไม่ได้พูดว่า "เกือบจะไม่" ... บางทีอาจจะเป็นในกรณีของคุณจริงๆคุณต้องการที่จะคว้าทุกอย่างและยังป้องกันไม่ให้ Ctrl-C หรือsys.exit()การออกจาก ฯลฯ )