2009-12-11 38 views
8

Tôi đang xây dựng một công cụ khi ngoại lệ lan truyền trở lên, dữ liệu mới về ngữ cảnh ngoại lệ sẽ được thêm vào ngoại lệ. Vấn đề là, vào thời điểm ngoại lệ được đưa lên cấp cao nhất, tất cả dữ liệu ngữ cảnh bổ sung đều ở đó, nhưng chỉ hiển thị dấu vết ngăn xếp mới nhất. Có cách nào dễ dàng để có ngoại lệ cho thấy dấu vết ngăn xếp ban đầu trong đó nó được ném thay vì dấu vết ngăn xếp cuối cùng hay tôi nên làm một cái gì đó như lấy dấu vết ngăn xếp ban đầu lần đầu tiên ngoại lệ lan truyền?Tuyên truyền ngoại lệ của Python

Ví dụ, đoạn mã sau:

def a(): 
    return UNBOUND 
def b(): 
    try: 
     a() 
    except Exception as e: 
     raise e 
b() 

mang lại các ngoại lệ sau đây:

Traceback (most recent call last): 
    File "test.py", line 8, in <module> 
    b() 
    File "test.py", line 7, in b 
    raise e 
NameError: global name 'UNBOUND' is not defined 

nơi, lý tưởng, tôi muốn bằng cách nào đó hiển thị các thành viên này:

Traceback (most recent call last): 
    File "test.py", line 8, in <module> 
    File "test.py", line 2, in a 
    return UNBOUND 
NameError: global name 'UNBOUND' is not defined 

Vì điều đó hướng người dùng đến dòng mà lỗi xảy ra ban đầu.

Trả lời

26

Ngoại lệ của Python hơi giống java, có một cách khiến cho ngoại lệ được gỡ bỏ mà không cần cắt bớt ngăn xếp.

Chỉ cần sử dụng raise không có đối số. Kết quả nó:

Traceback (most recent call last): 
    File "./exc.py", line 11, in <module> 
    b() 
    File "./exc.py", line 7, in b 
    a() 
    File "./exc.py", line 4, in a 
    return UNBOUND 
NameError: global name 'UNBOUND' is not defined 

Bạn có thể sửa đổi một số điều về đối tượng e, ngay cả khi bạn chỉ raise mà không cần lập luận rằng - ví dụ:

e.args = ("hi!",) 
raise 

sẽ thực sự thay đổi thông điệp ngoại lệ. Bạn có thể có thể thay đổi các tùy chọn khác theo cách này - mà không phá hủy ngăn xếp.

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