Gần đây tôi đã đi qua một số hành vi đáng ngạc nhiên trong phát Python:phát Python, không nuốt ngoại lệ trong 'coroutine'
class YieldOne:
def __iter__(self):
try:
yield 1
except:
print '*Excepted Successfully*'
# raise
for i in YieldOne():
raise Exception('test exception')
Mà cho kết quả:
*Excepted Successfully*
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
Exception: test exception
tôi (ngạc) ngạc nhiên rằng *Excepted Successfully*
đã được in, vì đây là những gì tôi muốn, nhưng cũng ngạc nhiên rằng Ngoại lệ vẫn được tuyên truyền lên đến cấp cao nhất. Tôi đã mong đợi phải sử dụng (nhận xét trong ví dụ này) raise
từ khóa để có được hành vi quan sát được.
Bất cứ ai có thể giải thích tại sao chức năng này hoạt động bình thường không và tại sao máy phát điện không nuốt phải ngoại lệ?
Đây có phải là trường hợp duy nhất trong Python, trong đó except
không nuốt một ngoại lệ?
Aha, bây giờ nó có ý nghĩa. Tôi đã không ban đầu mong đợi các ngoại lệ để propogate 'trên' để máy phát điện. – EoghanM
+1 rất thú vị! – rubik
+1 để chiếu sáng mẹo 'generator.throw'! – EoghanM