tương đương e.printStackTrace trong python


207

Tôi biết rằng print(e)(trong đó e là Ngoại lệ) in ngoại lệ đã xảy ra, nhưng tôi đã cố gắng tìm con trăn tương đương với Java e.printStackTrace()có dấu vết chính xác ngoại lệ với dòng nào xảy ra và in toàn bộ dấu vết của nó.

Bất cứ ai có thể xin vui lòng cho tôi biết tương đương với e.printStackTrace()Python?

Câu trả lời:



116

Cũng có logging.exception.

import logging

...

try:
    g()
except Exception as ex:
    logging.exception("Something awful happened!")
    # will print this message followed by traceback

Đầu ra:

ERROR 2007-09-18 23:30:19,913 error 1294 Something awful happened!
Traceback (most recent call last):
  File "b.py", line 22, in f
    g()
  File "b.py", line 14, in g
    1/0
ZeroDivisionError: integer division or modulo by zero

(Từ http://blog.tplus1.com/index.php/2007/09/11/the-python-logging-module-is-much-better-than-print-statements/ thông qua Cách in toàn bộ truy nguyên mà không cần in tạm dừng chương trình? )


Những lợi thế / bất lợi của điều này so với là traceback.print_exc()gì?
Nathan

18

tương đương e.printStackTrace trong python

Trong Java, điều này thực hiện như sau ( tài liệu ):

public void printStackTrace()

In cái có thể ném này và backtrace của nó vào luồng lỗi tiêu chuẩn ...

Điều này được sử dụng như thế này:

try
{ 
// code that may raise an error
}
catch (IOException e)
{
// exception handling
e.printStackTrace();
}

Trong Java, luồng Lỗi tiêu chuẩn không được xử lý để đầu ra đến ngay lập tức.

Các ngữ nghĩa tương tự trong Python 2 là:

import traceback
import sys
try: # code that may raise an error
    pass 
except IOError as e: # exception handling
    # in Python 2, stderr is also unbuffered
    print >> sys.stderr, traceback.format_exc()
    # in Python 2, you can also from __future__ import print_function
    print(traceback.format_exc(), file=sys.stderr)
    # or as the top answer here demonstrates, use:
    traceback.print_exc()
    # which also uses stderr.

Con trăn 3

Trong Python 3, chúng ta có thể nhận được truy nguyên trực tiếp từ đối tượng ngoại lệ (có khả năng hoạt động tốt hơn đối với mã luồng). Ngoài ra, stderr được đệm dòng , nhưng chức năng in nhận được một đối số tuôn ra, do đó, điều này sẽ được in ngay lập tức thành stderr:

    print(traceback.format_exception(None, # <- type(e) by docs, but ignored 
                                     e, e.__traceback__),
          file=sys.stderr, flush=True)

Phần kết luận:

Do đó, trong Python 3, traceback.print_exc()mặc dù nó sử dụng sys.stderr theo mặc định , sẽ đệm đầu ra và bạn có thể mất nó. Vì vậy, để có được ngữ nghĩa tương đương nhất có thể, trong Python 3, hãy sử dụng printvới flush=True.


3

Thêm vào các câu trả lời tuyệt vời khác, chúng ta có thể sử dụng Python loggingthư viện debug(), info(), warning(), error(), và critical()phương pháp. Trích dẫn từ các tài liệu cho Python 3.7.4 ,

Có ba đối số từ khóa trong kwargs được kiểm tra: exc_info, nếu nó không đánh giá là sai, sẽ khiến thông tin ngoại lệ được thêm vào thông điệp đăng nhập.

Điều này có nghĩa là gì, bạn có thể sử dụng loggingthư viện Python để xuất một debug()hoặc loại thông báo khác và loggingthư viện sẽ bao gồm dấu vết ngăn xếp trong đầu ra của nó. Với suy nghĩ này, chúng ta có thể làm như sau:

import logging

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

def f():
    a = { 'foo': None }
    # the following line will raise KeyError
    b = a['bar']

def g():
    f()

try:
    g()
except Exception as e:
    logger.error(str(e), exc_info=True)

Và nó sẽ xuất ra:

'bar'
Traceback (most recent call last):
  File "<ipython-input-2-8ae09e08766b>", line 18, in <module>
    g()
  File "<ipython-input-2-8ae09e08766b>", line 14, in g
    f()
  File "<ipython-input-2-8ae09e08766b>", line 10, in f
    b = a['bar']
KeyError: 'bar'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.