Làm thế nào để in một ngoại lệ trong Python?


Câu trả lời:


1062

Đối với Python 2.6 trở lên và Python 3.x:

except Exception as e: print(e)

Đối với Python 2.5 trở về trước, hãy sử dụng:

except Exception,e: print str(e)

41
str( KeyError('bad'))=> 'bad'- không nói loại ngoại lệ
Dave

10
print (e) trên keyerrors dường như chỉ cung cấp khóa, nhưng không phải là thông báo ngoại lệ đầy đủ, ít hữu ích hơn.
Veggiet

14
Nếu bạn định in ngoại lệ, tốt hơn là sử dụng print(repr(e)); việc Exception.__str__thực hiện cơ sở chỉ trả về thông báo ngoại lệ, không phải kiểu. Hoặc, sử dụng tracebackmô-đun, có các phương pháp để in ngoại lệ hiện tại, được định dạng hoặc truy nguyên đầy đủ.
Martijn Pieters

453

Các tracebackmô-đun cung cấp phương pháp để định dạng và in trường hợp ngoại lệ và tracebacks của họ, ví dụ như điều này sẽ in ngoại lệ như xử lý mặc định không:

import traceback

try:
    1/0
except Exception:
    traceback.print_exc()

Đầu ra:

Traceback (most recent call last):
  File "C:\scripts\divide_by_zero.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero

4
có một số loại cuộc gọi get_error_message mà tôi có thể in khi thấy tôi đang sử dụng thói quen in ấn của riêng mình để thêm một số thứ khác.
MikeSool

11
@MikeSool error_message = traceback.format_exc()
heyzling

3
Cảm ơn bạn, đây là một trong những tôi muốn. Toàn bộ dấu vết, không chỉ là loại lỗi và thông báo
Ken Bellows

Snipped này không sử dụng đối tượng ngoại lệ bị bắt. Bạn có thể mở rộng mã để sử dụng 'ex' không? - như trong except Exception as ex:...
aaronsteer

@aaronsteer nó sử dụng ngoại lệ bị bắt; trong một trình xử lý ngoại lệ, ngoại lệ hiện tại có sẵn thông qua sys.exc_info()hàm và traceback.print_exc()hàm lấy nó từ đó. Bạn chỉ cần vượt qua một ngoại lệ một cách rõ ràng khi không xử lý một ngoại lệ hoặc khi bạn muốn hiển thị thông tin dựa trên một ngoại lệ khác.
Martijn Pieters

169

Trong Python 2.6 trở lên, nó sạch hơn một chút:

except Exception as e: print(e)

Trong các phiên bản cũ hơn, nó vẫn khá dễ đọc:

except Exception, e: print e

15
Trong python3, phải sử dụng cách thứ 1, với "as".
Sam Watkins

53

Trong trường hợp bạn muốn truyền chuỗi lỗi, đây là một ví dụ từ Lỗi và Ngoại lệ (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

(Tôi sẽ để lại nhận xét này dưới dạng nhận xét về câu trả lời của @ jldupont, nhưng tôi không có đủ danh tiếng.)

Tôi cũng đã thấy câu trả lời như câu trả lời của @ jldupont ở những nơi khác. FWIW, tôi nghĩ điều quan trọng cần lưu ý là:

except Exception as e:
    print(e)

sẽ in đầu ra lỗi sys.stdouttheo mặc định. Một cách tiếp cận phù hợp hơn để xử lý lỗi nói chung sẽ là:

except Exception as e:
    print(e, file=sys.stderr)

(Lưu ý rằng bạn phải để import sysđiều này hoạt động.) Theo cách này, lỗi được in STDERRthay vì STDOUT, cho phép phân tích cú pháp / chuyển hướng đầu ra thích hợp / v.v. Tôi hiểu rằng câu hỏi nghiêm túc về 'in lỗi', nhưng điều quan trọng là chỉ ra cách thực hành tốt nhất ở đây thay vì bỏ qua chi tiết này có thể dẫn đến mã không chuẩn cho bất kỳ ai cuối cùng không học tốt hơn.

Tôi đã không sử dụng tracebackmô-đun như trong câu trả lời của Cat Plus Plus, và có lẽ đó là cách tốt nhất, nhưng tôi nghĩ tôi sẽ ném nó ra khỏi đó.


1
Tôi sẽ đề nghị thêm tuôn ra = True. Tôi đã nhận thấy với systemd (và không sử dụng khung ghi nhật ký thích hợp), việc đệm khi chụp vào tạp chí không phải là điều tôi mong đợi.
Cameron Kerr

20

Con trăn 3: logging

Thay vì sử dụng print()chức năng cơ bản , loggingmô-đun linh hoạt hơn có thể được sử dụng để ghi lại ngoại lệ. Các loggingmô-đun cung cấp rất nhiều chức năng bổ sung, ví dụ như thông điệp đăng nhập vào một tập tin đăng nhập nhất định, đăng tin nhắn với timestamps và thêm thông tin về nơi khai thác gỗ xảy ra. (Để biết thêm thông tin, hãy xem tài liệu chính thức .)

Ghi nhật ký một ngoại lệ có thể được thực hiện với chức năng cấp mô-đun logging.exception()như vậy:

import logging

try:
    1/0
except BaseException:
    logging.exception("An exception was thrown!")

Đầu ra:

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 

Ghi chú:

  • chức năng logging.exception()chỉ nên được gọi từ một trình xử lý ngoại lệ

  • các logging mô-đun không nên được sử dụng bên trong một handler khai thác gỗ để tránh một RecursionError(nhờ @PrakharPandey)


Mức log thay thế

Cũng có thể ghi nhật ký ngoại lệ với cấp độ nhật ký khác bằng cách sử dụng đối số từ khóa exc_info=Truenhư vậy:

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
Không nên được sử dụng trong trình xử lý đăng nhập để tránh RecursionError
Prakhar Pandey

4

Một lỗi nâng cao có thể được thực hiện với các câu lệnh khẳng định nếu đó là điều bạn muốn làm. Điều này sẽ giúp bạn viết mã có thể sửa lỗi tĩnh và kiểm tra lỗi sớm.

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

2

Người ta có khá nhiều quyền kiểm soát mà thông tin từ truy nguyên sẽ được hiển thị / ghi lại khi bắt ngoại lệ.

Mật mã

with open("not_existing_file.txt", 'r') as text:
    pass

sẽ tạo ra các dấu vết sau:

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'

In / Ghi nhật ký đầy đủ

Như những người khác đã đề cập, bạn có thể bắt được toàn bộ truy nguyên bằng cách sử dụng mô-đun truy nguyên:

import traceback
try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    traceback.print_exc()

Điều này sẽ tạo ra đầu ra sau đây:

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'

Bạn có thể đạt được điều tương tự bằng cách sử dụng đăng nhập:

try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    logger.error(exception, exc_info=True)

Đầu ra:

__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'

Tên / thông báo lỗi in / nhật ký

Bạn có thể không quan tâm đến toàn bộ truy nguyên, nhưng chỉ trong các thông tin quan trọng nhất, chẳng hạn như tên Ngoại lệ và thông báo Ngoại lệ, hãy sử dụng:

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))

Đầu ra:

Exception: FileNotFoundError
Exception message: [Errno 2] No such file or directory: 'not_existing_file.txt'
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.