Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Có cách chuẩn dùng exception chains trong Python 3 không?

Trong quá trình handle exception 'A', có thể exception 'B' khác xảy ra. Trong Python 2.0, nếu điều này xảy ra, exception B được propagated ra ngoài và exception A bị mất. Việc biết cả hai exceptions hữu ích để debug vấn đề.

Đôi khi exception handler có ý định re-raise exception, hoặc để cung cấp thêm thông tin hoặc translate exception sang type khác. Attribute __cause__ cung cấp cách explicit để record direct cause của exception.

Exception chaining chỉ có trong Python 3. Python 3 có mệnh đề raise ... from để chain exceptions. Chúng ta viết lại code cho trước dùng raise..from clause như sau:

try:
    s = {'a':1, 'b':2}['c']
except KeyError as e:
    raise ValueError('failed') from e

Python 3 sẽ mặc định show tất cả exceptions xảy ra trong exception handling, như sau:

Traceback (most recent call last):
  File "source_file.py", line 2, in 
    s = {'a':1, 'b':2}['c']
KeyError: 'c'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "source_file.py", line 4, in 
    raise ValueError('failed') from e
ValueError: failed