blob: c591fc1d8c158062b264a72652035bc1ae12e1d9 [file] [log] [blame]
# Test cases for exceptions (compile and run)
[case testException]
from typing import List
def f(x: List[int]) -> None:
g(x)
def g(x: List[int]) -> bool:
x[5] = 2
return True
def r1() -> None:
q1()
def q1() -> None:
raise Exception("test")
def r2() -> None:
q2()
def q2() -> None:
raise Exception
class A:
def __init__(self) -> None:
raise Exception
def hey() -> None:
A()
[file driver.py]
from native import f, r1, r2, hey
import traceback
try:
f([])
except IndexError:
traceback.print_exc()
try:
r1()
except Exception:
traceback.print_exc()
try:
r2()
except Exception:
traceback.print_exc()
try:
hey()
except Exception:
traceback.print_exc()
[out]
Traceback (most recent call last):
File "driver.py", line 4, in <module>
f([])
File "native.py", line 3, in f
g(x)
File "native.py", line 6, in g
x[5] = 2
IndexError: list assignment index out of range
Traceback (most recent call last):
File "driver.py", line 8, in <module>
r1()
File "native.py", line 10, in r1
q1()
File "native.py", line 13, in q1
raise Exception("test")
Exception: test
Traceback (most recent call last):
File "driver.py", line 12, in <module>
r2()
File "native.py", line 16, in r2
q2()
File "native.py", line 19, in q2
raise Exception
Exception
Traceback (most recent call last):
File "driver.py", line 16, in <module>
hey()
File "native.py", line 26, in hey
A()
File "native.py", line 23, in __init__
raise Exception
Exception
[case testTryExcept]
from typing import Any, Iterator
import wrapsys
def g(b: bool) -> None:
try:
if b:
x = [0]
x[1]
else:
raise Exception('hi')
except:
print("caught!")
def r(x: int) -> None:
if x == 0:
[0][1]
elif x == 1:
raise Exception('hi')
elif x == 2:
{1: 1}[0]
elif x == 3:
a = object() # type: Any
a.lol
def f(b: bool) -> None:
try:
r(int(b))
except AttributeError:
print('no')
except:
print(str(wrapsys.exc_info()[1]))
print(str(wrapsys.exc_info()[1]))
def h() -> None:
while True:
try:
raise Exception('gonna break')
except:
print(str(wrapsys.exc_info()[1]))
break
print(str(wrapsys.exc_info()[1]))
def i() -> None:
try:
r(0)
except:
print(type(wrapsys.exc_info()[1]))
raise
def j(n: int) -> None:
try:
r(n)
except (IndexError, KeyError):
print("lookup!")
except AttributeError as e:
print("attr! --", e)
def k() -> None:
try:
r(1)
except:
r(0)
def l() -> None:
try:
r(0)
except IndexError:
try:
r(2)
except KeyError as e:
print("key! --", e)
def m(x: object) -> int:
try:
st = id(x)
except Exception:
return -1
return st + 1
def iter_exception() -> Iterator[str]:
try:
r(0)
except KeyError as e:
yield 'lol'
[file wrapsys.py]
# This is a gross hack around some limitations of the test system/mypyc.
from typing import Any
import sys
def exc_info() -> Any:
return sys.exc_info() # type: ignore
[file driver.py]
import sys, traceback
from native import g, f, h, i, j, k, l, m, iter_exception
from testutil import assertRaises
print("== i ==")
try:
i()
except:
traceback.print_exc(file=sys.stdout)
print("== k ==")
try:
k()
except:
traceback.print_exc(file=sys.stdout)
print("== g ==")
g(True)
g(False)
print("== f ==")
f(True)
f(False)
print("== h ==")
h()
print("== j ==")
j(0)
j(2)
j(3)
try:
j(1)
except:
print("out!")
print("== l ==")
l()
m('lol')
with assertRaises(IndexError):
list(iter_exception())
[out]
== i ==
<class 'IndexError'>
Traceback (most recent call last):
File "driver.py", line 6, in <module>
i()
File "native.py", line 44, in i
r(0)
File "native.py", line 15, in r
[0][1]
IndexError: list index out of range
== k ==
Traceback (most recent call last):
File "native.py", line 59, in k
r(1)
File "native.py", line 17, in r
raise Exception('hi')
Exception: hi
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "driver.py", line 12, in <module>
k()
File "native.py", line 61, in k
r(0)
File "native.py", line 15, in r
[0][1]
IndexError: list index out of range
== g ==
caught!
caught!
== f ==
hi
None
list index out of range
None
== h ==
gonna break
None
== j ==
lookup!
lookup!
attr! -- 'object' object has no attribute 'lol'
out!
== l ==
key! -- 0
[case testTryFinally]
from typing import Any
import wrapsys
def a(b1: bool, b2: int) -> None:
try:
if b1:
raise Exception('hi')
finally:
print('finally:', str(wrapsys.exc_info()[1]))
if b2 == 2:
return
if b2 == 1:
raise Exception('again!')
def b(b1: int, b2: int) -> str:
try:
if b1 == 1:
raise Exception('hi')
elif b1 == 2:
[0][1]
elif b1 == 3:
return 'try'
except IndexError:
print('except')
finally:
print('finally:', str(wrapsys.exc_info()[1]))
if b2 == 2:
return 'finally'
if b2 == 1:
raise Exception('again!')
return 'outer'
def c() -> str:
try:
try:
return 'wee'
finally:
print("out a")
finally:
print("out b")
[file wrapsys.py]
# This is a gross hack around some limitations of the test system/mypyc.
from typing import Any
import sys
def exc_info() -> Any:
return sys.exc_info() # type: ignore
[file driver.py]
import traceback
import sys
from native import a, b, c
def run(f):
try:
x = f()
if x:
print("returned:", x)
except Exception as e:
print("caught:", type(e).__name__ + ": " + str(e))
print("== a ==")
for i in range(3):
for b1 in [False, True]:
run(lambda: a(b1, i))
print("== b ==")
for i in range(4):
for j in range(3):
run(lambda: b(i, j))
print("== b ==")
print(c())
[out]
== a ==
finally: None
finally: hi
caught: Exception: hi
finally: None
caught: Exception: again!
finally: hi
caught: Exception: again!
finally: None
finally: hi
== b ==
finally: None
returned: outer
finally: None
caught: Exception: again!
finally: None
returned: finally
finally: hi
caught: Exception: hi
finally: hi
caught: Exception: again!
finally: hi
returned: finally
except
finally: None
returned: outer
except
finally: None
caught: Exception: again!
except
finally: None
returned: finally
finally: None
returned: try
finally: None
caught: Exception: again!
finally: None
returned: finally
== b ==
out a
out b
wee
[case testCustomException]
from typing import List
class ListOutOfBounds(IndexError):
pass
class UserListWarning(UserWarning):
pass
def f(l: List[int], k: int) -> int:
try:
return l[k]
except IndexError:
raise ListOutOfBounds("Ruh-roh from f!")
def g(l: List[int], k: int) -> int:
try:
return f([1,2,3], 3)
except ListOutOfBounds:
raise ListOutOfBounds("Ruh-roh from g!")
def k(l: List[int], k: int) -> int:
try:
return g([1,2,3], 3)
except IndexError:
raise UserListWarning("Ruh-roh from k!")
def h() -> int:
try:
return k([1,2,3], 3)
except UserWarning:
return -1
[file driver.py]
from native import h
assert h() == -1
[case testExceptionAtModuleTopLevel]
from typing import Any
def f(x: int) -> None: pass
y: Any = ''
f(y)
[file driver.py]
import traceback
try:
import native
except TypeError:
traceback.print_exc()
else:
assert False
[out]
Traceback (most recent call last):
File "driver.py", line 3, in <module>
import native
File "native.py", line 6, in <module>
f(y)
TypeError: int object expected; got str