try:
something here
except:
print('the whatever error occurred.')
ฉันจะพิมพ์ข้อผิดพลาด / ข้อยกเว้นในexcept:
บล็อกของฉันได้อย่างไร
try:
something here
except:
print('the whatever error occurred.')
ฉันจะพิมพ์ข้อผิดพลาด / ข้อยกเว้นในexcept:
บล็อกของฉันได้อย่างไร
คำตอบ:
สำหรับ Python 2.6 และใหม่กว่าและ Python 3.x:
except Exception as e: print(e)
สำหรับ Python 2.5 และรุ่นก่อนหน้าให้ใช้:
except Exception,e: print str(e)
str( KeyError('bad'))
=> 'bad'
- ไม่บอกประเภทข้อยกเว้น
print(repr(e))
; Exception.__str__
การนำไปใช้งานพื้นฐานจะส่งคืนข้อความข้อยกเว้นไม่ใช่ชนิด หรือใช้traceback
โมดูลที่มีวิธีการพิมพ์ข้อยกเว้นปัจจุบันการจัดรูปแบบหรือการสืบค้นกลับเต็ม
traceback
โมดูลให้วิธีการจัดรูปแบบและการพิมพ์ข้อยกเว้นและ tracebacks ของพวกเขาเช่นนี้จะพิมพ์ข้อยกเว้นเช่นจัดการเริ่มต้นไม่:
import traceback
try:
1/0
except Exception:
traceback.print_exc()
เอาท์พุท:
Traceback (most recent call last):
File "C:\scripts\divide_by_zero.py", line 4, in <module>
1/0
ZeroDivisionError: division by zero
error_message = traceback.format_exc()
except Exception as ex:
...
sys.exc_info()
ฟังก์ชั่นและtraceback.print_exc()
ฟังก์ชั่นได้รับมันจากที่นั่น คุณจะต้องผ่านข้อยกเว้นอย่างชัดเจนเมื่อไม่จัดการข้อยกเว้นหรือเมื่อคุณต้องการแสดงข้อมูลตามข้อยกเว้นอื่น
ในPython 2.6 หรือสูงกว่ามันค่อนข้างสะอาดกว่า:
except Exception as e: print(e)
ในรุ่นเก่ามันยังอ่านได้ค่อนข้าง:
except Exception, e: print e
ในกรณีที่คุณต้องการส่งสตริงข้อผิดพลาดนี่คือตัวอย่างจากข้อผิดพลาดและข้อยกเว้น (Python 2.6)
>>> try:
... raise Exception('spam', 'eggs')
... except Exception as inst:
... print type(inst) # the exception instance
... print inst.args # arguments stored in .args
... print inst # __str__ allows args to printed directly
... x, y = inst # __getitem__ allows args to be unpacked directly
... print 'x =', x
... print 'y =', y
...
<type 'exceptions.Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
(ฉันจะปล่อยให้เรื่องนี้เป็นความคิดเห็นในคำตอบของ @ jldupont แต่ฉันไม่มีชื่อเสียงเพียงพอ)
ฉันเคยเห็นคำตอบเช่น @ jldupont คำตอบในที่อื่นด้วย FWIW ฉันคิดว่าสิ่งสำคัญที่ควรทราบคือ:
except Exception as e:
print(e)
จะพิมพ์เอาต์พุตข้อผิดพลาดเป็นsys.stdout
ค่าเริ่มต้น วิธีที่เหมาะสมกว่าในการจัดการข้อผิดพลาดโดยทั่วไปคือ:
except Exception as e:
print(e, file=sys.stderr)
(โปรดทราบว่าคุณต้องimport sys
ทำสิ่งนี้เพื่อให้ทำงานได้) ด้วยวิธีนี้ข้อผิดพลาดจะถูกพิมพ์ไปที่STDERR
แทนที่จะSTDOUT
ช่วยให้แยกวิเคราะห์ / เปลี่ยนเส้นทาง / etc เอาท์พุทที่เหมาะสม ฉันเข้าใจว่าคำถามนี้เกี่ยวกับ 'การพิมพ์ข้อผิดพลาด' อย่างเคร่งครัด แต่ดูเหมือนว่าการชี้แนะแนวทางที่ดีที่สุดที่นี่ไม่ใช่การทิ้งรายละเอียดนี้ซึ่งอาจนำไปสู่การใช้รหัสที่ไม่ได้มาตรฐานสำหรับผู้ที่ไม่ได้เรียนรู้ในที่สุด
ฉันไม่ได้ใช้traceback
โมดูลเหมือนคำตอบของ Cat Plus Plus และอาจเป็นวิธีที่ดีที่สุด แต่ฉันคิดว่าฉันจะใช้มันทิ้ง
logging
แทนที่จะใช้print()
ฟังก์ชันพื้นฐานlogging
โมดูลที่ยืดหยุ่นมากขึ้นสามารถใช้เพื่อบันทึกข้อยกเว้น logging
โมดูลข้อเสนอเป็นจำนวนมากฟังก์ชันการทำงานพิเศษเช่นการเข้าสู่ระบบข้อความลงในแฟ้มบันทึกได้รับการเข้าสู่ระบบข้อความที่มีการประทับเวลาและข้อมูลเพิ่มเติมเกี่ยวกับการเข้าสู่ระบบที่เกิดขึ้น (สำหรับข้อมูลเพิ่มเติมตรวจสอบเอกสารอย่างเป็นทางการ)
การบันทึกข้อยกเว้นสามารถทำได้ด้วยฟังก์ชันระดับโมดูลlogging.exception()
ดังนี้:
import logging
try:
1/0
except BaseException:
logging.exception("An exception was thrown!")
เอาท์พุท:
ERROR:root:An exception was thrown!
Traceback (most recent call last):
File ".../Desktop/test.py", line 4, in <module>
1/0
ZeroDivisionError: division by zero
หมายเหตุ:
logging.exception()
ควรเรียกใช้ฟังก์ชันจากตัวจัดการข้อยกเว้นเท่านั้น
logging
โมดูลไม่ควรนำมาใช้ภายในตัวจัดการการเข้าสู่ระบบเพื่อหลีกเลี่ยงRecursionError
(ขอบคุณ @PrakharPandey)
นอกจากนี้ยังสามารถบันทึกข้อยกเว้นด้วยระดับการบันทึกอื่นโดยใช้อาร์กิวเมนต์คำหลักexc_info=True
ดังนี้:
logging.debug("An exception was thrown!", exc_info=True)
logging.info("An exception was thrown!", exc_info=True)
logging.warning("An exception was thrown!", exc_info=True)
การเพิ่มซับในข้อผิดพลาดหนึ่งสามารถทำได้ด้วยคำสั่งยืนยันหากนั่นคือสิ่งที่คุณต้องการจะทำ สิ่งนี้จะช่วยให้คุณเขียนโค้ดที่แก้ไขได้แบบสแตติกและตรวจสอบข้อผิดพลาดก่อน
assert type(A) is type(""), "requires a string"
หนึ่งมีการควบคุมมากที่ข้อมูลจากการย้อนกลับที่จะแสดง / บันทึกเมื่อจับข้อยกเว้น
รหัส
with open("not_existing_file.txt", 'r') as text:
pass
จะสร้าง traceback ต่อไปนี้:
Traceback (most recent call last):
File "exception_checks.py", line 19, in <module>
with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'
ตามที่คนอื่นพูดถึงแล้วคุณสามารถติดตามการสืบค้นกลับทั้งหมดโดยใช้โมดูลการสืบค้นกลับ:
import traceback
try:
with open("not_existing_file.txt", 'r') as text:
pass
except Exception as exception:
traceback.print_exc()
สิ่งนี้จะสร้างผลลัพธ์ต่อไปนี้:
Traceback (most recent call last):
File "exception_checks.py", line 19, in <module>
with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'
คุณสามารถทำสิ่งเดียวกันได้โดยใช้การบันทึก:
try:
with open("not_existing_file.txt", 'r') as text:
pass
except Exception as exception:
logger.error(exception, exc_info=True)
เอาท์พุท:
__main__: 2020-05-27 12:10:47-ERROR- [Errno 2] No such file or directory: 'not_existing_file.txt'
Traceback (most recent call last):
File "exception_checks.py", line 27, in <module>
with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'
คุณอาจไม่สนใจในการติดตามกลับทั้งหมด แต่ใช้เฉพาะในข้อมูลที่สำคัญที่สุดเช่นชื่อข้อยกเว้นและข้อความข้อยกเว้นใช้:
try:
with open("not_existing_file.txt", 'r') as text:
pass
except Exception as exception:
print("Exception: {}".format(type(exception).__name__))
print("Exception message: {}".format(exception))
เอาท์พุท:
Exception: FileNotFoundError
Exception message: [Errno 2] No such file or directory: 'not_existing_file.txt'