| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448 |
- # 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
|