| 1 | #!/usr/bin/env python2
 | 
| 2 | from __future__ import print_function
 | 
| 3 | """Test exceptions for Byterun."""
 | 
| 4 | 
 | 
| 5 | import unittest
 | 
| 6 | 
 | 
| 7 | import vmtest
 | 
| 8 | 
 | 
| 9 | import six
 | 
| 10 | 
 | 
| 11 | PY3, PY2 = six.PY3, not six.PY3
 | 
| 12 | 
 | 
| 13 | 
 | 
| 14 | class TestExceptions(vmtest.VmTestCase):
 | 
| 15 |     def test_catching_exceptions(self):
 | 
| 16 |         # Catch the exception precisely
 | 
| 17 |         self.assert_ok("""\
 | 
| 18 |             try:
 | 
| 19 |                 [][1]
 | 
| 20 |                 print("Shouldn't be here...")
 | 
| 21 |             except IndexError:
 | 
| 22 |                 print("caught it!")
 | 
| 23 |             """)
 | 
| 24 |         # Catch the exception by a parent class
 | 
| 25 |         self.assert_ok("""\
 | 
| 26 |             try:
 | 
| 27 |                 [][1]
 | 
| 28 |                 print("Shouldn't be here...")
 | 
| 29 |             except Exception:
 | 
| 30 |                 print("caught it!")
 | 
| 31 |             """)
 | 
| 32 |         # Catch all exceptions
 | 
| 33 |         self.assert_ok("""\
 | 
| 34 |             try:
 | 
| 35 |                 [][1]
 | 
| 36 |                 print("Shouldn't be here...")
 | 
| 37 |             except:
 | 
| 38 |                 print("caught it!")
 | 
| 39 |             """)
 | 
| 40 | 
 | 
| 41 |     def test_raise_exception(self):
 | 
| 42 |         self.assert_ok("raise Exception('oops')", raises=Exception)
 | 
| 43 | 
 | 
| 44 |     def test_raise_exception_class(self):
 | 
| 45 |         self.assert_ok("raise ValueError", raises=ValueError)
 | 
| 46 | 
 | 
| 47 |     if PY2:
 | 
| 48 |         def test_raise_exception_2args(self):
 | 
| 49 |             self.assert_ok("raise ValueError, 'bad'", raises=ValueError)
 | 
| 50 | 
 | 
| 51 |         def test_raise_exception_3args(self):
 | 
| 52 |             self.assert_ok("""\
 | 
| 53 |                 from sys import exc_info
 | 
| 54 |                 try:
 | 
| 55 |                     raise Exception
 | 
| 56 |                 except:
 | 
| 57 |                     _, _, tb = exc_info()
 | 
| 58 |                 raise ValueError, "message", tb
 | 
| 59 |                 """, raises=ValueError)
 | 
| 60 | 
 | 
| 61 |     def test_raise_and_catch_exception(self):
 | 
| 62 |         self.assert_ok("""\
 | 
| 63 |             try:
 | 
| 64 |                 raise ValueError("oops")
 | 
| 65 |             except ValueError as e:
 | 
| 66 |                 print("Caught: %s" % e)
 | 
| 67 |             print("All done")
 | 
| 68 |             """)
 | 
| 69 | 
 | 
| 70 |     if PY3:
 | 
| 71 |         def test_raise_exception_from(self):
 | 
| 72 |             self.assert_ok(
 | 
| 73 |                 "raise ValueError from NameError",
 | 
| 74 |                 raises=ValueError
 | 
| 75 |             )
 | 
| 76 | 
 | 
| 77 |     def test_raise_and_catch_exception_in_function(self):
 | 
| 78 |         self.assert_ok("""\
 | 
| 79 |             def fn():
 | 
| 80 |                 raise ValueError("oops")
 | 
| 81 | 
 | 
| 82 |             try:
 | 
| 83 |                 fn()
 | 
| 84 |             except ValueError as e:
 | 
| 85 |                 print("Caught: %s" % e)
 | 
| 86 |             print("done")
 | 
| 87 |             """)
 | 
| 88 | 
 | 
| 89 |     def test_global_name_error(self):
 | 
| 90 |         self.assert_ok("fooey", raises=NameError)
 | 
| 91 |         self.assert_ok("""\
 | 
| 92 |             try:
 | 
| 93 |                 fooey
 | 
| 94 |                 print("Yes fooey?")
 | 
| 95 |             except NameError:
 | 
| 96 |                 print("No fooey")
 | 
| 97 |             """)
 | 
| 98 | 
 | 
| 99 |     def test_local_name_error(self):
 | 
| 100 |         self.assert_ok("""\
 | 
| 101 |             def fn():
 | 
| 102 |                 fooey
 | 
| 103 |             fn()
 | 
| 104 |             """, raises=NameError)
 | 
| 105 | 
 | 
| 106 |     def test_catch_local_name_error(self):
 | 
| 107 |         self.assert_ok("""\
 | 
| 108 |             def fn():
 | 
| 109 |                 try:
 | 
| 110 |                     fooey
 | 
| 111 |                     print("Yes fooey?")
 | 
| 112 |                 except NameError:
 | 
| 113 |                     print("No fooey")
 | 
| 114 |             fn()
 | 
| 115 |             """)
 | 
| 116 | 
 | 
| 117 |     def test_reraise(self):
 | 
| 118 |         self.assert_ok("""\
 | 
| 119 |             def fn():
 | 
| 120 |                 try:
 | 
| 121 |                     fooey
 | 
| 122 |                     print("Yes fooey?")
 | 
| 123 |                 except NameError:
 | 
| 124 |                     print("No fooey")
 | 
| 125 |                     raise
 | 
| 126 |             fn()
 | 
| 127 |             """, raises=NameError)
 | 
| 128 | 
 | 
| 129 |     def test_reraise_explicit_exception(self):
 | 
| 130 |         self.assert_ok("""\
 | 
| 131 |             def fn():
 | 
| 132 |                 try:
 | 
| 133 |                     raise ValueError("ouch")
 | 
| 134 |                 except ValueError as e:
 | 
| 135 |                     print("Caught %s" % e)
 | 
| 136 |                     raise
 | 
| 137 |             fn()
 | 
| 138 |             """, raises=ValueError)
 | 
| 139 | 
 | 
| 140 |     def test_finally_while_throwing(self):
 | 
| 141 |         self.assert_ok("""\
 | 
| 142 |             def fn():
 | 
| 143 |                 try:
 | 
| 144 |                     print("About to..")
 | 
| 145 |                     raise ValueError("ouch")
 | 
| 146 |                 finally:
 | 
| 147 |                     print("Finally")
 | 
| 148 |             fn()
 | 
| 149 |             print("Done")
 | 
| 150 |             """, raises=ValueError)
 | 
| 151 | 
 | 
| 152 |     def test_coverage_issue_92(self):
 | 
| 153 |         self.assert_ok("""\
 | 
| 154 |             l = []
 | 
| 155 |             for i in range(3):
 | 
| 156 |                 try:
 | 
| 157 |                     l.append(i)
 | 
| 158 |                 finally:
 | 
| 159 |                     l.append('f')
 | 
| 160 |                 l.append('e')
 | 
| 161 |             l.append('r')
 | 
| 162 |             print(l)
 | 
| 163 |             assert l == [0, 'f', 'e', 1, 'f', 'e', 2, 'f', 'e', 'r']
 | 
| 164 |             """)
 | 
| 165 | 
 | 
| 166 | 
 | 
| 167 | if __name__ == '__main__':
 | 
| 168 |     unittest.main()
 |