20

Trong Python, cách tốt nhất để nắm bắt ngoại lệ "tất cả" là gì?Bắt tất cả ngoại lệ trong Python

except: # do stuff with sys.exc_info()[1] 

except BaseException as exc: 

except Exception as exc: 

Bắt giữ có thể được thực hiện trong một chuỗi.

Mục tiêu của tôi là để đăng nhập bất kỳ ngoại lệ có thể được ném theo mã bình thường mà không che bất kỳ trường hợp ngoại lệ Python đặc biệt, chẳng hạn như những người mà chỉ ra quá trình chấm dứt, vv

Bắt một xử lý để ngoại lệ (chẳng hạn như bằng các điều khoản ở trên có chứa exc) cũng là mong muốn.

Trả lời

20

Nếu bạn cần phải nắm bắt tất cả các trường hợp ngoại lệ và làm những thứ tương tự cho tất cả, tôi sẽ đề nghị bạn này:

try: 
    #stuff 
except: 
    # do some stuff 

Nếu bạn không muốn che giấu ngoại lệ python "đặc biệt", sử dụng các ngoại lệ lớp cơ sở

try: 
    #stuff 
except Exception: 
    # do some stuff 

đối với một số trường hợp ngoại lệ quản lý liên quan, bắt chúng một cách rõ ràng:

try: 
    #stuff 
except FirstExceptionBaseClassYouWantToCatch as exc: 
    # do some stuff 
except SecondExceptionBaseClassYouWantToCatch as exc: 
    # do some other stuff based 
except (ThirdExceptionBaseClassYouWantToCatch, FourthExceptionBaseClassYouWantToCatch) as exc: 
    # do some other stuff based 

Các exception hierarchy từ tài liệu python nên là một đọc hữu ích.

+1

Cảm ơn các liên kết đến các hệ thống phân cấp ngoại lệ. :) – EOL

0

Để tránh che giấu ngoại lệ cơ bản, bạn cần phải "tăng lại" bất kỳ ngoại lệ nào không phải là ngoại lệ mà bạn rõ ràng muốn xử lý, ví dụ: (Chuyển thể từ 8. Errors and Exceptions):

 
import sys

try: # do something that could throw an exception: 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: # maybe log the exception (e.g. in debug mode) # re-raise the exception: raise

+1

Cuối cùng 'trừ: nâng cao 'không làm bất cứ điều gì: nó có thể được bỏ qua hoàn toàn; các ngoại lệ không phải IOError và non-ValueError chỉ đơn giản là không bị bắt và được trình thông dịch tự động nâng lên. – EOL

+1

@EOL Bạn nói đúng. Tôi đã chỉnh sửa câu trả lời của mình để cho biết lý do tại sao ngoại trừ: có thể hữu ích. – Peter

29
  • except Exception: vs except BaseException::

    Sự khác biệt giữa bắt ExceptionBaseException là theo ngoại lệ exception hierarchy như SystemExit, KeyboardInterrupt và GeneratorExit sẽ không bị bắt khi sử dụng except Exception vì họ kế thừa trực tiếp từ BaseException.

  • except: vs except BaseException::

    Sự khác biệt giữa hai này là chủ yếu trong python 2 (AFAIK), và nó chỉ khi sử dụng một lớp phong cách cũ như một ngoại lệ được nâng lên, trong trường hợp này chỉ biểu hiện ít trừ mệnh đề sẽ có thể bắt được ngoại lệ, ví dụ.

    class NewStyleException(Exception): pass 
    
    try: 
        raise NewStyleException 
    except BaseException: 
        print "Caught" 
    
    class OldStyleException: pass 
    
    try: 
        raise OldStyleException 
    except BaseException: 
        print "BaseException caught when raising OldStyleException" 
    except: 
        print "Caught" 
    
+2

Tôi đã tạo ra 'NewStyleException' kế thừa từ 'Ngoại lệ', như được chính thức đề xuất (http://docs.python.org/tutorial/errors.html#user-defined-exceptions). – EOL

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