จับทั่วไปสำหรับ python


89

ฉันมีพฤติกรรมแปลก ๆ บางอย่างที่ดูเหมือนจะทำให้เกิดข้อยกเว้นเงียบ ๆ ฉันจะเขียน try catch ทั่วไปได้อย่างไรซึ่งฉันสามารถดีบักข้อยกเว้นทั้งหมดได้อย่างไร บางสิ่งบางอย่างตามแนวของ:

try:
    # something that fails
except e:
    print e

ข้อมูลเพิ่มเติมเกี่ยวกับปัญหาในมือโดยละเอียด:

ฉันมีแอพ Django ที่บนคอมพิวเตอร์ของฉัน (Ubuntu Linux 8.10) ทำงานได้ดีทั้งผ่านรันเนอร์และ mod-python บนเซิร์ฟเวอร์ปรับใช้ (Ubuntu Linux 8.10) ทำงานได้ดีผ่านรันเนอร์ แต่ล้มเหลวผ่าน apache ใน mod-python

ฉันได้ลดสาเหตุลงเป็นส่วนหนึ่งของแอปที่ใช้ Berkeley DB (bsddb.db) และคีย์รอง วิธีการโทรกลับสำหรับคีย์รองใช้การดองเพื่อจัดรูปแบบคีย์ มันล้มเหลวเมื่อฉันเรียกดองด้วยค่าเดียว อย่างไรก็ตามจะล้มเหลวเฉพาะเมื่อฉันใช้ cPickle และการใช้ pickle กับค่าเดียวกันนอกฟังก์ชันเรียกกลับก็ใช้ได้เช่นกัน

ฉันแค่อยากรู้ว่าทำไม cPickle ถึงล้มเหลว

คำตอบ:


169

มีการพิมพ์ข้อยกเว้นไว้แล้วโดยค่าเริ่มต้นก่อนที่โปรแกรมจะยุติ หากคุณต้องการส่งข้อผิดพลาดไปที่อื่น (ไม่ต้องพิมพ์) คุณสามารถทำได้:

try:
    something()
except Exception as e:
    send_somewhere(traceback.format_exception(*sys.exc_info()))
    raise # reraises the exception

โปรดทราบว่ารูปแบบนี้ใช้asคีย์เวิร์ดสำหรับ python> 2.6 วิธีเดิมคือ:

except Exception, e:

5
ไม่รู้เกี่ยวกับการเปลี่ยนแปลง "Exception as e" "ข้อยกเว้น e" ทำให้ฉันหงุดหงิดเสมอดีใจที่ได้เห็นมันถูกทำความสะอาด
กุฏ

3
คำหลัก 'as' ใช้สำหรับ python> = 2.6
pixelbeat

วิธีง่ายๆ แต่ฉัน Google มันทุก ๆ เดือนและคลิกที่ลิงค์ด้านบนและจบลงที่นี่
niCk cAMel

3

โมดูล tracebackค่อนข้างมีประโยชน์สำหรับการจัดรูปแบบ tracebacks จากนั้นคุณสามารถเขียนลงในไฟล์บันทึกได้


1

มันใช้ได้ไหม? :

except BaseException, e:

11
คุณไม่ควรจับBaseException- รวมถึงSystemExitและKeyboardInterruptสิ่งที่คุณมักไม่ต้องการจับ
nosklo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.