2015-02-24 15 views
6

aşağıdaki asgari örneği düşünün: Python 2 ile bu kod çalıştırmaKapsam ve 3

try: 
    raise Exception('foo') 
except Exception: 
    try: 
    raise Exception('bar') 
    except Exception: 
    pass 
    raise 

Python 3 ile çalışan, istisna çıtayı yükseltiyor istisna foo yükseltir . Yine de, Python 2 ve Python 3 belgelerinin hiçbir ifade içermeyen raise "geçerli kapsamda etkin olan son istisnayı" yükselteceğini belirtir. Python 2 ve 3'te neden farklıdır? Fark herhangi bir yerde belgelenmiş mi?

+0

https://docs.python.org/3.0/whatsnew/3.0.html#changes-to-exceptions – jonrsharpe

+0

'daki istisnalar için 2.x vs. 3.x değişikliklerini görebilirsiniz. Görünüşe göre bu, PEP 3110 https://www.python.org/dev/peps/pep-3110/ tarafından konulan ve 2 ile 3 arası bir değişiklikle belgelere konulan blokların istisna isimlerinin gizli olarak temizlenmesiyle ilgilidir: https : //docs.python.org/2/reference/compound_stmts.html#try https://docs.python.org/3/reference/compound_stmts.html#try. Ancak bu en iyi ihtimalle eksiktir, çünkü bunun yalnızca "hedef olarak" kullanılarak atanan istisnalar için geçerli olduğunu iddia eder. – a3nm

+1

Davranış farkı 2.7.9 ve 3.4.3rc1'de doğrulandı. İzleyicide (bugs.python.org) bir sorun çıkarabilir misiniz? (Henüz değilse.) –

cevap

2

Python 3 daha gelişmiş olduğundan kapsamlar farklıdır. :)

girintili try ile bar başlar kapsamı ve bunun except fıkrada geçen deyimi sonra sona erer

(veya finally tamlaması olmuştu); Çıplak raise açıkça fooexcept stanza'dadır, ve bu yeniden denenir.

Bu, Python 3'te düzeltilen küçük şeylerden biridir. Dokümanlar daha net olabilir.

+0

Tamam, Python 3 yolunun daha sezgisel olduğunu kabul ediyorum. Aslında bunun bilindiğini ve belgelerin iyileştirilmesi gerektiğini doğrulamak istedim, bu yüzden Python halkı tarafından 23556 sayılı sayının ele alınmasına kadar söyleyecek başka bir şey kalmadı. Teşekkürler! – a3nm