ฉันจะเขียนtry
/ except
บล็อกที่จับข้อยกเว้นทั้งหมดได้อย่างไร
sys.stderr
และอาจถูกบันทึกไว้ นั่นเป็นข้อยกเว้นที่สมบูรณ์และเป็นเรื่องปกติ
try: whatever() except Exception as e: exp_capture()
?
ฉันจะเขียนtry
/ except
บล็อกที่จับข้อยกเว้นทั้งหมดได้อย่างไร
sys.stderr
และอาจถูกบันทึกไว้ นั่นเป็นข้อยกเว้นที่สมบูรณ์และเป็นเรื่องปกติ
try: whatever() except Exception as e: exp_capture()
?
คำตอบ:
คุณสามารถ แต่คุณอาจไม่ควร:
try:
do_something()
except:
print "Caught it!"
อย่างไรก็ตามสิ่งนี้จะจับข้อยกเว้นเช่นกันKeyboardInterrupt
และคุณมักไม่ต้องการสิ่งนั้นใช่ไหม ยกเว้นว่าคุณยกข้อยกเว้นขึ้นอีกครั้ง - ดูตัวอย่างต่อไปนี้จากเอกสาร :
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
except ValueError:
print "Could not convert data to an integer."
except:
print "Unexpected error:", sys.exc_info()[0]
raise
except Exception:
ยกเว้นว่าคุณมีที่นั่นก็จะจับ BaseException คน
นอกเหนือจากexcept:
ข้อเปล่า(ซึ่งคนอื่นบอกว่าคุณไม่ควรใช้) คุณสามารถจับException
:
import traceback
import logging
try:
whatever()
except Exception as e:
logging.error(traceback.format_exc())
# Logs the error appropriately.
โดยปกติคุณจะพิจารณาทำสิ่งนี้ในระดับนอกสุดของรหัสของคุณถ้าเช่นคุณต้องการจัดการกับข้อยกเว้นที่ไม่ถูกตรวจจับอย่างอื่นก่อนที่จะยุติ
ข้อได้เปรียบของexcept Exception
ภาพเปลือยexcept
คือมีข้อยกเว้นบางประการที่ไม่ชัดเจนส่วนใหญ่KeyboardInterrupt
แล้วSystemExit
: ถ้าคุณจับและกลืนสิ่งเหล่านั้นคุณอาจทำให้มันยากสำหรับทุกคนที่จะออกจากสคริปต์ของคุณ
Exception
subclass โปรดทราบว่ามันเป็นไปไม่ได้ที่จะเพิ่มint
ข้อยกเว้นและพยายามที่จะยกTypeError
ข้อยกเว้นซึ่งเป็นสิ่งที่จะถูกจับโดยexcept Exception
ประโยคปิดล้อมในกรณีดังกล่าว ในทางกลับกันคลาสแบบเก่าสามารถยกขึ้นและมีคุณสมบัติเป็น "ไม่ใช่ข้อยกเว้น" ที่ไม่ได้คลาสย่อยException
- นี้จะถูกจับโดยexcept
ประโยคเปล่าแต่ไม่ใช่โดยexcept Exception
ประโยค
TypeError
sys.exit()
มักจะหมายความว่าคุณคาดหวังว่าแอปจะยุติ แต่ถ้าคุณจับ SystemExit มันจะไม่ เช่นเดียวกันถ้าคุณกด control-C บนสคริปต์ที่กำลังรัน (Ctrl-break บน windows) คุณคาดว่าโปรแกรมจะหยุดไม่จับข้อผิดพลาดและดำเนินต่อไป แต่คุณสามารถจับทั้งสองอย่างนี้ถ้าคุณต้องการล้างก่อนที่จะมีอยู่
คุณสามารถทำได้เพื่อจัดการข้อยกเว้นทั่วไป
try:
a = 2/0
except Exception as e:
print e.__doc__
print e.message
BaseException
การจับข้อยกเว้นเป็นไปได้ทั้งหมดจับ มันอยู่ด้านบนของลำดับชั้นข้อยกเว้น:
Python 3: https://docs.python.org/3.5/library/exceptions.html#exception-hierarchy
Python 2.7: https://docs.python.org/2.7/library/exceptions.html#exception-hierarchy
try:
something()
except BaseException as error:
print('An exception occurred: {}'.format(error))
แต่ตามที่คนอื่นพูดถึงคุณมักจะไม่ต้องการสิ่งนี้เฉพาะกรณีที่เฉพาะเจาะจง
ตัวอย่างที่ง่ายมากคล้ายกับตัวอย่างที่พบที่นี่:
http://docs.python.org/tutorial/errors.html#defining-clean-up-actions
หากคุณกำลังพยายามที่จะรับข้อยกเว้นทั้งหมดให้วางโค้ดทั้งหมดของคุณไว้ในคำสั่ง "ลอง:" แทนที่ 'พิมพ์ "การดำเนินการที่อาจทำให้เกิดข้อยกเว้น"'
try:
print "Performing an action which may throw an exception."
except Exception, error:
print "An exception was thrown!"
print str(error)
else:
print "Everything looks great!"
finally:
print "Finally is called directly after executing the try statement whether an exception is thrown or not."
ในตัวอย่างด้านบนคุณจะเห็นผลลัพธ์ตามลำดับนี้:
1) ทำการกระทำที่อาจทำให้เกิดข้อยกเว้น
2) ในที่สุดจะถูกเรียกใช้โดยตรงหลังจากดำเนินการคำสั่งลองว่ามีข้อผิดพลาดเกิดขึ้นหรือไม่
3) "มีข้อผิดพลาดเกิดขึ้น!" หรือ "ทุกอย่างดูดี!" ขึ้นอยู่กับว่าข้อยกเว้นถูกโยน
หวังว่านี่จะช่วยได้!
มีหลายวิธีในการทำเช่นนี้โดยเฉพาะกับ Python 3.0 ขึ้นไป
วิธีที่ 1
นี่เป็นวิธีการที่ง่าย แต่ไม่แนะนำเพราะคุณจะไม่ทราบว่ารหัสบรรทัดใดที่ทำให้เกิดข้อยกเว้น:
def bad_method():
try:
sqrt = 0**-1
except Exception as e:
print(e)
bad_method()
วิธีที่ 2
แนะนำวิธีการนี้เนื่องจากให้รายละเอียดเพิ่มเติมเกี่ยวกับข้อยกเว้นแต่ละข้อ มันรวมถึง:
ข้อเสียเปรียบเพียงอย่างเดียวคือ tracback จำเป็นต้องนำเข้า
import traceback
def bad_method():
try:
sqrt = 0**-1
except Exception:
print(traceback.print_exc())
bad_method()
ฉันเพิ่งค้นพบเคล็ดลับเล็กน้อยสำหรับการทดสอบว่าชื่อข้อยกเว้นใน Python 2.7 บางครั้งฉันจัดการข้อยกเว้นเฉพาะในรหัสดังนั้นฉันต้องการทดสอบเพื่อดูว่าชื่อนั้นอยู่ในรายการข้อยกเว้นที่จัดการหรือไม่
try:
raise IndexError #as test error
except Exception as e:
excepName = type(e).__name__ # returns the name of the exception
try:
whatever()
except:
# this will catch any exception or error
เป็นมูลค่าการกล่าวขวัญนี้ไม่เหมาะสม Python coding สิ่งนี้จะตรวจจับข้อผิดพลาดมากมายที่คุณอาจไม่ต้องการตรวจจับ