Câu trả lời:
Đố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)
str( KeyError('bad'))
=> 'bad'
- không nói loại ngoại lệ
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 traceback
mô-đ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 đủ.
Các traceback
mô-đ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
error_message = traceback.format_exc()
except Exception as ex:
...
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.
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
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
(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.stdout
theo 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 STDERR
thay 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 traceback
mô-đ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 đó.
logging
Thay vì sử dụng print()
chức năng cơ bản , logging
mô-đun linh hoạt hơn có thể được sử dụng để ghi lại ngoại lệ. Các logging
mô-đ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)
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=True
như 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)
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"
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'
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'
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'