Làm thế nào tôi có thể viết một try
/ except
khối bắt tất cả các ngoại lệ?
sys.stderr
và có thể được ghi lại. Đó là một ngoại lệ hoàn toàn hợp lệ và phổ biến.
try: whatever() except Exception as e: exp_capture()
chưa?
Làm thế nào tôi có thể viết một try
/ except
khối bắt tất cả các ngoại lệ?
sys.stderr
và có thể được ghi lại. Đó là một ngoại lệ hoàn toàn hợp lệ và phổ biến.
try: whatever() except Exception as e: exp_capture()
chưa?
Câu trả lời:
Bạn có thể nhưng có lẽ bạn không nên:
try:
do_something()
except:
print "Caught it!"
Tuy nhiên, điều này cũng sẽ bắt gặp các ngoại lệ như KeyboardInterrupt
và bạn thường không muốn điều đó, phải không? Trừ khi bạn nêu lại ngoại lệ ngay lập tức - xem ví dụ sau từ các tài liệu :
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
except ValueError:
print "Could not convert data to an integer."
except:
print "Unexpected error:", sys.exc_info()[0]
raise
except Exception:
ngoại trừ bạn có ở đó cũng sẽ bắt được những câu hỏi BaseException.
Ngoài một except:
mệnh đề trần (mà như những người khác đã nói bạn không nên sử dụng), bạn có thể chỉ cần nắm bắt Exception
:
import traceback
import logging
try:
whatever()
except Exception as e:
logging.error(traceback.format_exc())
# Logs the error appropriately.
Thông thường bạn sẽ chỉ bao giờ xem xét việc này ở cấp độ ngoài cùng của mã của mình nếu ví dụ bạn muốn xử lý bất kỳ trường hợp ngoại lệ nào khác trước khi chấm dứt.
Ưu điểm của except Exception
việc trần trụi except
là có một vài trường hợp ngoại lệ mà nó sẽ không nắm bắt được, rõ ràng nhất KeyboardInterrupt
và SystemExit
: nếu bạn bắt và nuốt chúng thì bạn có thể khiến mọi người khó thoát khỏi kịch bản của mình.
Exception
. Lưu ý rằng không thể đưa ra int
một ngoại lệ và cố gắng làm như vậy sẽ tạo ra một TypeError
ngoại lệ, đó là điều sẽ bị bắt bởi except Exception
mệnh đề kèm theo trong trường hợp như vậy. Mặt khác, một lớp kiểu cũ có thể được nâng lên và đủ điều kiện là "không ngoại lệ" không phải là lớp con Exception
- điều này sẽ bị bắt bởi một except
mệnh đề trần nhưng không phải bởi một except Exception
mệnh đề.
TypeError
sys.exit()
thường có nghĩa là bạn mong muốn ứng dụng chấm dứt nhưng nếu bạn bắt gặp SystemExit thì nó sẽ không. Tương tự như vậy nếu bạn nhấn control-C trên tập lệnh đang chạy (Ctrl-break trên windows), bạn hy vọng chương trình sẽ dừng, không bắt lỗi và tiếp tục. Nhưng bạn có thể bắt một trong hai hoặc cả hai thứ này nếu bạn muốn dọn dẹp trước khi tồn tại.
Bạn có thể làm điều này để xử lý các trường hợp ngoại lệ chung
try:
a = 2/0
except Exception as e:
print e.__doc__
print e.message
Để nắm bắt tất cả các ngoại lệ có thể, bắt BaseException
. Nó nằm trên hệ thống phân cấp Exception:
Python 3: https://docs.python.org/3.5/l Library / exceptions.html # exception-hierarchy
Python 2.7: https://docs.python.org/2.7/l Library / exceptions.html # exception-harcharchy
try:
something()
except BaseException as error:
print('An exception occurred: {}'.format(error))
Nhưng như những người khác đã đề cập, bạn thường sẽ không cần điều này, chỉ cho các trường hợp cụ thể.
Ví dụ rất đơn giản, tương tự như ví dụ được tìm thấy ở đây:
http://docs.python.org/tutorial/errors.html#defining-clean-up-ilities
Nếu bạn đang cố bắt TẤT CẢ các ngoại lệ, thì hãy đặt tất cả mã của bạn vào câu lệnh "thử:", thay cho 'in "Thực hiện một hành động có thể ném ngoại lệ."'.
try:
print "Performing an action which may throw an exception."
except Exception, error:
print "An exception was thrown!"
print str(error)
else:
print "Everything looks great!"
finally:
print "Finally is called directly after executing the try statement whether an exception is thrown or not."
Trong ví dụ trên, bạn sẽ thấy đầu ra theo thứ tự này:
1) Thực hiện một hành động có thể ném một ngoại lệ.
2) Cuối cùng được gọi trực tiếp sau khi thực hiện câu lệnh thử xem có ngoại lệ được ném hay không.
3) "Một ngoại lệ đã được ném!" hoặc "Mọi thứ trông thật tuyệt!" tùy thuộc vào việc một ngoại lệ đã được ném.
Hi vọng điêu nay co ich!
Có nhiều cách để làm điều này cụ thể với Python 3.0 trở lên
Cách tiếp cận 1
Đây là cách tiếp cận đơn giản nhưng không được khuyến nghị vì bạn sẽ không biết chính xác dòng mã nào thực sự ném ngoại lệ:
def bad_method():
try:
sqrt = 0**-1
except Exception as e:
print(e)
bad_method()
Cách tiếp cận 2
Cách tiếp cận này được khuyến nghị vì nó cung cấp chi tiết hơn về từng ngoại lệ. Nó bao gồm:
Hạn chế duy nhất là tracback cần phải được nhập khẩu.
import traceback
def bad_method():
try:
sqrt = 0**-1
except Exception:
print(traceback.print_exc())
bad_method()
Tôi vừa tìm ra mẹo nhỏ này để kiểm tra nếu tên ngoại lệ trong Python 2.7. Đôi khi tôi đã xử lý các trường hợp ngoại lệ cụ thể trong mã, vì vậy tôi cần một bài kiểm tra để xem tên đó có nằm trong danh sách các trường hợp ngoại lệ được xử lý hay không.
try:
raise IndexError #as test error
except Exception as e:
excepName = type(e).__name__ # returns the name of the exception
try:
whatever()
except:
# this will catch any exception or error
Điều đáng nói là đây không phải là mã Python thích hợp. Điều này cũng sẽ bắt được nhiều lỗi mà bạn có thể không muốn bắt.