วิธีพิมพ์ข้อยกเว้นใน Python


724
try:
    something here
except:
    print('the whatever error occurred.')

ฉันจะพิมพ์ข้อผิดพลาด / ข้อยกเว้นในexcept:บล็อกของฉันได้อย่างไร


คำตอบ:


1062

สำหรับ Python 2.6 และใหม่กว่าและ Python 3.x:

except Exception as e: print(e)

สำหรับ Python 2.5 และรุ่นก่อนหน้าให้ใช้:

except Exception,e: print str(e)

41
str( KeyError('bad'))=> 'bad'- ไม่บอกประเภทข้อยกเว้น
เดฟ

10
พิมพ์ (e) บน keyerrors ดูเหมือนจะให้เฉพาะคีย์ แต่ไม่ใช่ข้อความแสดงข้อยกเว้นแบบเต็มซึ่งมีประโยชน์น้อยกว่า
Veggiet

14
หากคุณกำลังจะพิมพ์ข้อยกเว้นมันจะดีกว่าที่จะใช้print(repr(e)); Exception.__str__การนำไปใช้งานพื้นฐานจะส่งคืนข้อความข้อยกเว้นไม่ใช่ชนิด หรือใช้tracebackโมดูลที่มีวิธีการพิมพ์ข้อยกเว้นปัจจุบันการจัดรูปแบบหรือการสืบค้นกลับเต็ม
Martijn Pieters

451

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

3
มีการเรียก get_error_message ชนิดใดที่ฉันสามารถพิมพ์ด้วยการดูเนื่องจากฉันใช้รูทีนการพิมพ์ของตัวเองเพื่อเพิ่มสิ่งอื่น ๆ
MikeSchem

10
@MikeSchem error_message = traceback.format_exc()
heyzling

3
ขอบคุณนี่คือสิ่งที่ฉันต้องการ การติดตามทั้งหมดไม่ใช่เฉพาะชนิดข้อผิดพลาดและข้อความ
Ken Bellows

snipped นี้ไม่ได้ใช้วัตถุข้อยกเว้นที่จับ คุณสามารถขยายรหัสเพื่อใช้ 'ex' ได้หรือไม่ - เหมือนในexcept Exception as ex:...
aaronsteers

@aaronsteers มันใช้ข้อยกเว้นที่จับ; ในตัวจัดการข้อยกเว้นข้อยกเว้นปัจจุบันสามารถใช้ได้ผ่านsys.exc_info()ฟังก์ชั่นและtraceback.print_exc()ฟังก์ชั่นได้รับมันจากที่นั่น คุณจะต้องผ่านข้อยกเว้นอย่างชัดเจนเมื่อไม่จัดการข้อยกเว้นหรือเมื่อคุณต้องการแสดงข้อมูลตามข้อยกเว้นอื่น
Martijn Pieters

169

ในPython 2.6 หรือสูงกว่ามันค่อนข้างสะอาดกว่า:

except Exception as e: print(e)

ในรุ่นเก่ามันยังอ่านได้ค่อนข้าง:

except Exception, e: print e

15
ใน python3 ต้องใช้วิธีที่ 1 โดยมี "เป็น"
Sam Watkins

53

ในกรณีที่คุณต้องการส่งสตริงข้อผิดพลาดนี่คือตัวอย่างจากข้อผิดพลาดและข้อยกเว้น (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

38

(ฉันจะปล่อยให้เรื่องนี้เป็นความคิดเห็นในคำตอบของ @ 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 และอาจเป็นวิธีที่ดีที่สุด แต่ฉันคิดว่าฉันจะใช้มันทิ้ง


1
ฉันขอแนะนำให้เพิ่ม flush = True เพิ่มเติม ฉันสังเกตเห็นด้วย systemd (และไม่ใช้กรอบการบันทึกที่เหมาะสม) การกำหนดบัฟเฟอร์เมื่อจับภาพบันทึกประจำวันไม่ใช่สิ่งที่ฉันคาดไว้
Cameron Kerr

20

Python 3: 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)

1
ไม่ควรใช้ภายในตัวจัดการการบันทึกเพื่อหลีกเลี่ยงการเรียกซ้ำ
Prakhar Pandey

4

การเพิ่มซับในข้อผิดพลาดหนึ่งสามารถทำได้ด้วยคำสั่งยืนยันหากนั่นคือสิ่งที่คุณต้องการจะทำ สิ่งนี้จะช่วยให้คุณเขียนโค้ดที่แก้ไขได้แบบสแตติกและตรวจสอบข้อผิดพลาดก่อน

assert type(A) is type(""), "requires a string"

2

หนึ่งมีการควบคุมมากที่ข้อมูลจากการย้อนกลับที่จะแสดง / บันทึกเมื่อจับข้อยกเว้น

รหัส

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'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.