Soru Python’da artış nedir?


Aşağıdaki kodu göz önünde bulundurun:

try:
    raise Exception("a")
except:
    try:
        raise Exception("b")
    finally:
        raise

Bu artacak Exception: a. Ben yükseltmek için bekleniyor Exception: b (nedenini açıklamama gerek var mı?). Niçin final raise En son istisna olan yerine (benim düşündüğüm) orijinal istisnayı yükseltmek mi?


29
2017-10-14 17:00


Menşei


Python 3.1 her ikisini de arttırır. - kennytm
Ah. Python 2.6'da olduğumu söylemeliydim. - wilhelmtell
Sadece meraktan: C # derleyicisinin aynı kombinasyon üzerinde yazdığı "Hata: Hiçbir argüman içermeyen bir atlatma ifadesi, en yakın kapalı yakalama maddesinin içine yerleştirilmiş son cümlede izin verilmez" (throw == zam, catch == dışında). Belirsizlik yok! - Andrey
@Andrey, ancak kodun belirsizlik yaratmasını beklemezdim. İlk istisnayı ikinci istisnayı bekledim. eskiden düşünürdüm raise atılan son istisnayı ifade eder. Yanlış olduğunu öğrendim. - wilhelmtell
@Andrey Sorunuz neydi? - aaronasterling


Cevaplar:


Python2.6 üzerinde

Nihayet, "B" istisnasını yükselttiğiniz "try" bloğuyla bağlanacak son bloğun olmasını bekliyorsunuzdur. Son olarak blok, ilk "try" bloğuna eklenir.

İç deneme bloğuna bir istisna bloğu eklediyseniz, sonuncu blok istisna B'yi yükseltir.

try:
  raise Exception("a")
except:
  try:
    raise Exception("b")
  except:
    pass
  finally:
    raise

Çıktı:

Traceback (most recent call last):
  File "test.py", line 5, in <module>
    raise Exception("b")
Exception: b

Burada neler olduğunu açıklayan başka bir varyasyon

try:
  raise Exception("a")
except:
  try:
    raise Exception("b")
  except:
    raise

Çıktı:

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    raise Exception("b")
Exception: b

Burada görüyorsanız, sonuncu bloğun değiştirilmesi hariç istisnayı B kaldırır.


15
2017-10-14 17:05



Aynı sonuca vardım. - Klaus Byskov Pedersen
Gerçekten, bu işler! Hiç tahmin edemezdim. Bu bir yerlerde belgelenmiş mi? Bu bir özellik midir yoksa gramerdeki sorunlardan gelen bir zorunluluk mu? - wilhelmtell
Neden ikinci istisna sadece ilkini gölgelendirmiyor? Python'un sözdizimi için hata yapmasını veya en azından beni bunun hakkında uyarmasını dilerdim. - wilhelmtell
wilhelmtell: raise yakaladığınız son istisna değil, yakaladığınız son istisnayı yeniden yükseltir. Eğer denersen raise bir istisna atarak ve daha önce herhangi bir istisna yakalamadan sonra, yeniden yükseltecek hiçbir şey olmadığından bir TypeError elde edeceksiniz. - geoffspear
Cümlen The finally block is attached to the first "try" block. çok yanıltıcıdır, sözdizimsel bakış açısıyla yanlıştır. Neyin daha iyi olduğuna konsantre ol raise bağlanır. Sanırım bu daha iyi ifade edilmeli (belki de daha önce cümle). - Wolf


Yükseltdiğiniz son istisna değil, yakaladığınız son istisnayı tekrar yükseltir.

(açıklık için yorumlardan bildirilmiştir)


26