tôi sẽ làm điều này trong một cách tương tự như bạn đang nghĩ đến việc sử dụng của bạn sẽ không vượt qua 'Gandalf xử lý ngoại lệ except Exception
to catch all non-system-exiting exceptions trong khi tạo ra các trường hợp ngoại lệ được liệt kê đen set
cần vượt qua và kết thúc sẽ được nâng cấp lại.
Sử dụng Gandalf handler sẽ đảm bảo GeneratorExit
, SystemExit
và KeyboardInterrupt
(tất cả các trường hợp ngoại lệ hệ thống thoát) vượt qua và chấm dứt chương trình nếu không có bộ xử lý khác có mặt cao hơn trong các cuộc gọi stack. Đây là nơi bạn có thể kiểm tra với type(e)
rằng __class__
của ngoại lệ bị bắt e
thực sự thuộc về bộ ngoại lệ được liệt kê đen và lại raise
nó.
Như một cuộc biểu tình nhỏ:
import exceptions # Py2.x only
# dictionary holding {exception_name: exception_class}
excptDict = vars(exceptions)
exceptionNames = ['MemoryError', 'OSError', 'SystemError'] # and others
# set containing black-listed exceptions
blackSet = {excptDict[exception] for exception in exceptionNames}
Bây giờ blackSet = {OSError, SystemError, MemoryError}
giữ lớp học của phi hệ thống thoát ngoại lệ chúng tôi muốn không xử lý.
Một try-except
khối bây giờ có thể trông như thế này:
try:
# calls that raise exceptions:
except Exception as e:
if type(e) in blackSet: raise e # re-raise
# else just handle it
Một dụ mà bắt tất cả các trường hợp ngoại lệ sử dụng BaseException
có thể giúp minh họa những gì tôi có ý nghĩa. (điều này được thực hiện cho mục đích trình diễn chỉ, để xem cách thức tăng này cuối cùng sẽ chấm dứt chương trình của bạn).Lưu ý: Tôi là không đề xuất bạn sử dụng BaseException
; Tôi đang sử dụng nó để chứng minh gì ngoại lệ sẽ thực sự 'đi qua' và gây chấm dứt (tức là tất cả những gì BaseException
đánh bắt):
for i, j in excptDict.iteritems():
if i.startswith('__'): continue # __doc__ and other dunders
try:
try:
raise j
except Exception as ex:
# print "Handler 'Exception' caught " + str(i)
if type(ex) in blackSet:
raise ex
except BaseException:
print "Handler 'BaseException' caught " + str(i)
# prints exceptions that would cause the system to exit
Handler 'BaseException' caught GeneratorExit
Handler 'BaseException' caught OSError
Handler 'BaseException' caught SystemExit
Handler 'BaseException' caught SystemError
Handler 'BaseException' caught KeyboardInterrupt
Handler 'BaseException' caught MemoryError
Handler 'BaseException' caught BaseException
Cuối cùng, để làm cho Python này 2/3 thuyết bất khả tri , bạn có thể try
và import exceptions
và nếu điều đó không thành công (trong Python 3), hãy quay lại nhập builtins
chứa tất cả Exceptions
; chúng tôi tìm kiếm từ điển theo tên nên nó làm cho không có sự khác biệt:
try:
import exceptions
excDict = vars(exceptions)
except ImportError:
import builtins
excDict = vars(builtins)
Tôi không biết nếu có một cách thông minh hơn để thực sự làm được điều này, một giải pháp khác có thể là thay vì có một try-except
với một signle except
, có 2 các trình xử lý, một cho các trường hợp ngoại lệ được liệt kê đen và trường hợp khác cho trường hợp chung:
try:
# calls that raise exceptions:
except tuple(blackSet) as be: # Must go first, of course.
raise be
except Exception as e:
# handle the rest
Điều này cũng có thể giúp quyết định về việc quản lý phân biệt ngoại lệ được xây dựng trong: https://docs.python.org/3.5/library/exceptions.html#exception-hierarchy – Timur