41_exception.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. try:
  2. for i in range(5):
  3. raise KeyError(i)
  4. exit(1)
  5. except KeyError:
  6. pass
  7. x = 0
  8. for i in range(5):
  9. try:
  10. for j in range(5):
  11. while True:
  12. raise KeyError(i)
  13. x += 3
  14. except KeyError:
  15. x += i
  16. assert x == 10
  17. class A:
  18. def __getitem__(self, i):
  19. raise KeyError(i)
  20. try:
  21. a = A()
  22. b = a[1]
  23. exit(1)
  24. except:
  25. pass
  26. try:
  27. a = {'1': 3, 4: None}
  28. x = a[1]
  29. exit(1)
  30. except:
  31. pass
  32. assert True
  33. def f():
  34. try:
  35. raise KeyError('foo')
  36. except IndexError: # will fail to catch
  37. exit(1)
  38. except:
  39. pass
  40. assert True
  41. f()
  42. def f1():
  43. try:
  44. assert 1 + 2 == 3
  45. try:
  46. a = {1: 2, 3: 4}
  47. x = a[0]
  48. except RuntimeError:
  49. exit(1)
  50. except IndexError:
  51. exit(1)
  52. exit(1)
  53. try:
  54. f1()
  55. exit(1)
  56. except KeyError:
  57. pass
  58. assert True, "Msg"
  59. try:
  60. assert False, "Msg"
  61. exit(1)
  62. except AssertionError:
  63. pass
  64. def f(a: list):
  65. try:
  66. raise ValueError
  67. exit(1)
  68. except:
  69. pass
  70. a[0] = 1
  71. a = [0]
  72. f(a)
  73. assert a == [1]
  74. try:
  75. a = [][3]
  76. except IndexError as e:
  77. assert str(e) == '3 not in [0, 0)'
  78. assert repr(e).startswith('IndexError(')
  79. try:
  80. a = {}[2]
  81. except IndexError as e:
  82. exit(1)
  83. except Exception as e:
  84. assert type(e) is KeyError
  85. assert str(e) == '2'
  86. assert repr(e).startswith('KeyError(')
  87. except:
  88. exit(1)
  89. class MyException(Exception):
  90. pass
  91. class MyException2(MyException):
  92. pass
  93. try:
  94. raise MyException2
  95. except MyException as e:
  96. ok = True
  97. except Exception:
  98. exit(1)
  99. assert ok
  100. ok = False
  101. try:
  102. eval('1+')
  103. except SyntaxError as e:
  104. assert type(e) is SyntaxError
  105. ok = True
  106. assert ok
  107. # finally, only
  108. def finally_only():
  109. try:
  110. raise KeyError
  111. finally:
  112. return True
  113. assert finally_only() is True
  114. def finally_only_2():
  115. try:
  116. pass
  117. finally:
  118. return True
  119. assert finally_only_2() is True
  120. # finally, no exception
  121. def finally_no_exception():
  122. ok = False
  123. try:
  124. pass
  125. except KeyError:
  126. exit(1)
  127. finally:
  128. ok = True
  129. return ok
  130. assert finally_no_exception()
  131. # finally, match
  132. def finally_match():
  133. ok = False
  134. try:
  135. raise KeyError
  136. except KeyError:
  137. pass
  138. finally:
  139. ok = True
  140. return ok
  141. assert finally_match()
  142. # finally, no match
  143. ok = False
  144. def finally_no_match():
  145. global ok
  146. try:
  147. raise KeyError
  148. except IndexError:
  149. exit(1)
  150. finally:
  151. ok = True
  152. try:
  153. finally_no_match()
  154. except KeyError:
  155. assert ok
  156. exit(0)
  157. exit(1)