mirror of
https://github.com/licsber/micropython.git
synced 2024-09-21 09:30:24 +08:00
3cd2c281d7
The native emitter keeps the current exception in a slot in its C stack (instead of on its Python value stack), so when it catches an exception it must explicitly clear that slot so the same exception is not reraised later on.
85 lines
1.3 KiB
Python
85 lines
1.3 KiB
Python
print("noexc-finally")
|
|
try:
|
|
print("try")
|
|
finally:
|
|
print("finally")
|
|
|
|
print("noexc-finally-finally")
|
|
try:
|
|
print("try1")
|
|
try:
|
|
print("try2")
|
|
finally:
|
|
print("finally2")
|
|
finally:
|
|
print("finally1")
|
|
print()
|
|
|
|
print("noexc-finally-func-finally")
|
|
def func2():
|
|
try:
|
|
print("try2")
|
|
finally:
|
|
print("finally2")
|
|
|
|
try:
|
|
print("try1")
|
|
func2()
|
|
finally:
|
|
print("finally1")
|
|
print()
|
|
|
|
|
|
print("exc-finally-except")
|
|
try:
|
|
print("try1")
|
|
try:
|
|
print("try2")
|
|
foo()
|
|
except:
|
|
print("except2")
|
|
finally:
|
|
print("finally1")
|
|
print()
|
|
|
|
print("exc-finally-except-filter")
|
|
try:
|
|
print("try1")
|
|
try:
|
|
print("try2")
|
|
foo()
|
|
except NameError:
|
|
print("except2")
|
|
finally:
|
|
print("finally1")
|
|
print()
|
|
|
|
|
|
print("exc-except-finally-finally")
|
|
try: # top-level catch-all except to not fail script
|
|
try:
|
|
print("try1")
|
|
try:
|
|
print("try2")
|
|
foo()
|
|
finally:
|
|
print("finally2")
|
|
finally:
|
|
print("finally1")
|
|
except:
|
|
print("catch-all except")
|
|
print()
|
|
|
|
# case where a try-except within a finally cancels the exception
|
|
print("exc-finally-subexcept")
|
|
try:
|
|
print("try1")
|
|
finally:
|
|
try:
|
|
print("try2")
|
|
foo
|
|
except:
|
|
print("except2")
|
|
print("finally1")
|
|
print()
|