2017-06-20 15 views
8

sự khác biệt giữa hai là gì là gì:phần chênh lệch giữa trừ và trừ BaseException

except: 
    # do something 

except BaseException as be: 
    print(be) 

Ý tôi là trong trường hợp đầu tiên tất cả các ngoại lệ có thể được bắt gặp, nhưng là này đúng cho lần thứ hai?

Bạn cũng có thể in thông báo lỗi bằng cách sử dụng trường hợp đầu tiên?

Trả lời

9

Thực tế nói, có có sự khác biệt giữaexcept:except BaseException:, đối với bất kỳ phiên bản Python hiện hành.

Đó là vì bạn không thể chỉ tăng bất kỳ loại đối tượng nào làm ngoại lệ. Các raise statement rõ ràng không cho phép nâng cao bất kỳ điều gì khác:

[...] nâng cao đánh giá biểu thức đầu tiên làm đối tượng ngoại lệ. Nó phải là một phân lớp hoặc một thể hiện của BaseException.

Mỏ nhấn mạnh đậm. Tuy nhiên, điều này không phải lúc nào cũng xảy ra, trong các bản phát hành Python cũ hơn (2.4 và trước đó), bạn cũng có thể sử dụng chuỗi làm ngoại lệ.

Lợi thế sau đó là bạn có thể dễ dàng truy cập ngoại lệ bị bắt. Để có thể thêm as targetname, bạn phải bắt một loại ngoại lệ cụ thể và chỉ BaseException sẽ thực hiện việc đó.

Bạn vẫn có thể truy cập vào các ngoại lệ đang hoạt động bằng cách sử dụng sys.exc_info() mặc dù:

except: 
    be = sys.ext_info()[1] 

Chọn những gì bạn cảm thấy là có thể đọc được nhiều hơn cho bản thân trong tương lai của bạn và đồng nghiệp của bạn.

+2

Trừ khi bạn chưa đặt một cái gì đó như 'BaseException = ValueError' trước ;-)' except: 'đảm bảo luôn luôn ngoại trừ bất kỳ lỗi nào. –

+1

@a_guest: vâng, * tên * vẫn có thể được phục hồi. 'builtins.BaseException' là một dự phòng đẹp, nhưng không phải là một cách dễ dàng. –

Các vấn đề liên quan