จะพิมพ์การติดตามย้อนกลับแบบเต็มโดยไม่หยุดโปรแกรมได้อย่างไร
เมื่อคุณไม่ต้องการหยุดโปรแกรมของคุณเนื่องจากข้อผิดพลาดคุณต้องจัดการกับข้อผิดพลาดนั้นด้วยการลอง / ยกเว้น:
try:
do_something_that_might_error()
except Exception as error:
handle_the_error(error)
ในการแยกการtraceback
สืบค้นกลับแบบเต็มเราจะใช้โมดูลจากไลบรารีมาตรฐาน:
import traceback
และเพื่อสร้างสแต็คเทรซที่ซับซ้อนอย่างเหมาะสมเพื่อแสดงให้เห็นว่าเราได้สแต็คเต็มรูปแบบ:
def raise_error():
raise RuntimeError('something bad happened!')
def do_something_that_might_error():
raise_error()
การพิมพ์
หากต้องการพิมพ์การติดตามย้อนกลับแบบเต็มให้ใช้traceback.print_exc
วิธีการ:
try:
do_something_that_might_error()
except Exception as error:
traceback.print_exc()
สิ่งที่พิมพ์:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
ดีกว่าการพิมพ์บันทึก:
อย่างไรก็ตามแนวปฏิบัติที่เหมาะสมที่สุดคือการตั้งค่าตัวบันทึกสำหรับโมดูลของคุณ มันจะรู้ชื่อของโมดูลและสามารถเปลี่ยนระดับได้ (ระหว่างคุณสมบัติอื่น ๆ เช่นตัวจัดการ)
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
ในกรณีนี้คุณจะต้องการใช้logger.exception
ฟังก์ชันแทน:
try:
do_something_that_might_error()
except Exception as error:
logger.exception(error)
บันทึกใด:
ERROR:__main__:something bad happened!
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
หรือบางทีคุณแค่ต้องการสตริงในกรณีนี้คุณจะต้องการtraceback.format_exc
ฟังก์ชันแทน:
try:
do_something_that_might_error()
except Exception as error:
logger.debug(traceback.format_exc())
บันทึกใด:
DEBUG:__main__:Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
ข้อสรุป
และสำหรับตัวเลือกทั้งสามเราจะเห็นว่าเราได้รับผลลัพธ์เช่นเดียวกับเมื่อเรามีข้อผิดพลาด:
>>> do_something_that_might_error()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in do_something_that_might_error
File "<stdin>", line 2, in raise_error
RuntimeError: something bad happened!
print(sys.exc_info()[0]
<class 'Exception'>
พิมพ์