documentation dla instrukcji raise bez argumentów mówiprzebicie bez argumentu
If no expressions are present, raise re-raises the last exception that was active in the current scope.
Kiedyś myślałem, że oznaczało, że obecna funkcja należało wykonanie klauzuli except
. Po przeczytaniu this question i eksperymentowaniu trochę, myślę, że oznacza to, że każda funkcja na stosie musi być wykonana klauzula except
, ale nie jestem pewien. Również mam sobie sprawę, że nie ma pojęcia, w jaki sposób działa ślad stosu z podbiciem no-Arg
def f():
try:
raise Exception
except:
g()
def g():
raise
f()
produkuje
Traceback (most recent call last):
File "foo", line 10, in <module>
f()
File "foo", line 5, in f
g()
File "foo", line 3, in f
raise Exception
Exception
To nie wygląda na stosie w czasie podbicie początkowe lub stos w momencie ponownego przebicia lub łączenie obu stosów lub cokolwiek co mogę zrozumieć.
Mam rację co do podbicia bez argonu, szukającego jakiejkolwiek funkcji na stosie, wykonującej klauzulę except
? Ponadto, jak działa śledzenie stosu przy przebiciu?
Dobre pytanie! – Marcin
Warto zauważyć, że wszystkie te rzeczy zostały wyczyszczone - i znacznie lepiej udokumentowane - w Pythonie 3.x. Możesz więc o wiele lepiej spojrzeć na 3.3 niż 2.7. (IIRC, samo sformułowanie dla 'raise' nie jest dużo lepsze, ale pojęcie" aktywnego wyjątku "jest faktycznie zdefiniowane gdzieś lub w innym miejscu, więc po prostu musisz je wyszukać zamiast próbować odgadnąć jego znaczenie ...) – abarnert