Làm thế nào để in toàn bộ truy nguyên mà không tạm dừng chương trình?
Khi bạn không muốn dừng chương trình của mình do lỗi, bạn cần xử lý lỗi đó bằng một lần thử / ngoại trừ:
try:
do_something_that_might_error()
except Exception as error:
handle_the_error(error)
Để trích xuất toàn bộ truy nguyên, chúng tôi sẽ sử dụng traceback
mô-đun từ thư viện chuẩn:
import traceback
Và để tạo một stacktrace phức tạp để chứng minh rằng chúng ta có được stacktrace đầy đủ:
def raise_error():
raise RuntimeError('something bad happened!')
def do_something_that_might_error():
raise_error()
In ấn
Để in toàn bộ truy nguyên, sử dụng traceback.print_exc
phương pháp:
try:
do_something_that_might_error()
except Exception as error:
traceback.print_exc()
Bản in nào:
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!
Tốt hơn là in, ghi nhật ký:
Tuy nhiên, cách tốt nhất là cài đặt bộ ghi cho mô-đun của bạn. Nó sẽ biết tên của mô-đun và có thể thay đổi cấp độ (trong số các thuộc tính khác, chẳng hạn như trình xử lý)
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
Trong trường hợp đó, bạn sẽ muốn logger.exception
chức năng thay thế:
try:
do_something_that_might_error()
except Exception as error:
logger.exception(error)
Nhật ký nào:
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!
Hoặc có lẽ bạn chỉ muốn chuỗi, trong trường hợp đó, bạn sẽ muốn traceback.format_exc
hàm thay thế:
try:
do_something_that_might_error()
except Exception as error:
logger.debug(traceback.format_exc())
Nhật ký nào:
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!
Phần kết luận
Và đối với cả ba tùy chọn, chúng tôi thấy chúng tôi nhận được cùng một đầu ra như khi chúng tôi gặp lỗi:
>>> 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]
bản in<class 'Exception'>
.