có cách nào để có ipython chỉ hiển thị Ngoại lệ đã bị bắt giữ, thay vì hiển thị vị trí trong mã mà nó bị bắt không?
Bạn có thể sử dụng sys.excepthook
:
import sys
def exc_hook(type, value, traceback):
print type
sys.excepthook = exc_hook
Từ sys
module documentation:
sys.excepthook(type, value, traceback)
Chức năng này in ra một traceback nhất định và ngoại lệ đối với sys.stderr.
Khi ngoại lệ được nêu ra và không bị bắt, thông dịch viên gọi sys.excepthook với ba đối số, lớp ngoại lệ, trường hợp ngoại lệ và đối tượng truy nguyên. Trong một phiên tương tác, này xảy ra ngay trước khi điều khiển được trả về dấu nhắc; trong một chương trình Python điều này xảy ra ngay trước khi chương trình thoát. Việc xử lý các ngoại lệ cấp cao nhất như vậy có thể được tùy chỉnh bằng cách chỉ định một hàm khác là ba đối số cho sys.excepthook
.
sys.__displayhook__
sys.__excepthook__
Những đối tượng chứa các giá trị ban đầu của displayhook và excepthook vào lúc bắt đầu của chương trình. Chúng được lưu để displayhook và excepthook có thể được khôi phục trong trường hợp chúng xảy ra để có được được thay thế bằng các đối tượng bị hỏng.
Bạn cũng có thể thử bắt đầu ipython với --xmode
tùy chọn thiết lập để Plain
Từ IPython reference:
$ ipython [options] files
--xmode=<modename>
Chế độ báo cáo ngoại lệ.
Chế độ hợp lệ: Plain, Context and Verbose.
Đồng bằng: tương tự như in traceback bình thường của python.
Bối cảnh: in 5 dòng mã nguồn ngữ cảnh xung quanh mỗi dòng trong phần truy nguyên.
Verbose: tương tự Bối cảnh, nhưng bổ sung in các biến hiện có thể nhìn thấy nơi ngoại lệ xảy ra (rút ngắn chuỗi nếu quá dài). Điều này có thể có khả năng rất chậm, nếu bạn xảy ra để có cấu trúc dữ liệu lớn có biểu diễn chuỗi phức tạp để tính toán. Máy tính của bạn có thể bị treo trong một thời gian với việc sử dụng CPU ở mức 100%. Nếu điều này xảy ra, bạn có thể hủy truy xuất bằng Ctrl-C (có thể nhấn nhiều lần).
Dưới đây là một số ví dụ về cách sử dụng. Chú ý sự khác biệt trong dòng cho mỗi traceback:
--xmode=Plain
:
[ 19:55 [email protected] ~/SO/python ]$ ipython --xmode=Plain ipython-debugger-full-traceback-on-interactive-pdb.py
------------------------------------------------------------
Traceback (most recent call last):
File "ipython-debugger-full-traceback-on-interactive-pdb.py", line 2, in <module>
1/0
ZeroDivisionError: integer division or modulo by zero
--xmode=Context
:
[ 19:55 [email protected] ~/SO/python ]$ ipython --xmode=Context ipython-debugger-full-traceback-on-interactive-pdb.py
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/home/jon/SO/python/ipython-debugger-full-traceback-on-interactive-pdb.py in <module>()
1
----> 2 #!/usr/bin/python
3 1/0
4
5
ZeroDivisionError: integer division or modulo by zero
--xmode=Verbose
:
[ 19:54 [email protected] ~/SO/python ]$ ipython --xmode=Verbose ipython-debugger-full-traceback-on-interactive-pdb.py
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/home/jon/SO/python/ipython-debugger-full-traceback-on-interactive-pdb.py in <module>()
1
----> 2 #!/usr/bin/python
3 1/0
4
5
ZeroDivisionError: integer division or modulo by zero
Và không có quy định cụ thể một file py:
--xmode=Plain
:
[ 19:55 [email protected] ~/SO/python ]$ ipython --xmode=Plain
In [1]: 1/0
------------------------------------------------------------
Traceback (most recent call last):
File "<ipython console>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
--xmode=Context
:
[ 20:03 [email protected] ~/SO/python ]$ ipython --xmode=Context
In [1]: 1/0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/home/jon/SO/python/<ipython console> in <module>()
ZeroDivisionError: integer division or modulo by zero
--xmode=Verbose
:
[ 20:01 [email protected] ~/SO/python ]$ ipython --xmode=Verbose
In [1]: 1/0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/home/jon/SO/python/<ipython console> in <module>()
ZeroDivisionError: integer division or modulo by zero
Using the Python debugger.
Đây là lỗi trong IPython 0.11 - traceback được in sau khi bạn rời khỏi trình gỡ rối, thay vì trước khi nó bắt đầu. Nó sẽ được cố định cho 0,12 (nên được ra trước Giáng sinh). –