test_exceptions.py 4.38 KB
Newer Older
Guido van Rossum's avatar
Guido van Rossum committed
1 2 3
# Python test set -- part 5, built-in exceptions

from test_support import *
4
from types import ClassType
5
import warnings
6
import sys, traceback
7

Guido van Rossum's avatar
Guido van Rossum committed
8 9 10
print '5. Built-in exceptions'
# XXX This is not really enough, each *operation* should be tested!

11 12 13 14 15 16 17 18
# Reloading the built-in exceptions module failed prior to Py2.2, while it
# should act the same as reloading built-in sys.
try:
    import exceptions
    reload(exceptions)
except ImportError, e:
    raise TestFailed, e

19 20 21 22 23 24 25 26 27 28 29
def test_raise_catch(exc):
    try:
        raise exc, "spam"
    except exc, err:
        buf = str(err)
    try:
        raise exc("spam")
    except exc, err:
        buf = str(err)
    print buf

30
def r(thing):
31
    test_raise_catch(thing)
32
    if isinstance(thing, ClassType):
33
        print thing.__name__
34
    else:
35
        print thing
Guido van Rossum's avatar
Guido van Rossum committed
36 37 38 39 40 41 42 43 44 45 46 47 48

r(AttributeError)
import sys
try: x = sys.undefined_attribute
except AttributeError: pass

r(EOFError)
import sys
fp = open(TESTFN, 'w')
fp.close()
fp = open(TESTFN, 'r')
savestdin = sys.stdin
try:
Fred Drake's avatar
Fred Drake committed
49 50 51 52 53
    try:
        sys.stdin = fp
        x = raw_input()
    except EOFError:
        pass
Guido van Rossum's avatar
Guido van Rossum committed
54
finally:
Fred Drake's avatar
Fred Drake committed
55 56
    sys.stdin = savestdin
    fp.close()
Guido van Rossum's avatar
Guido van Rossum committed
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

r(IOError)
try: open('this file does not exist', 'r')
except IOError: pass

r(ImportError)
try: import undefined_module
except ImportError: pass

r(IndexError)
x = []
try: a = x[10]
except IndexError: pass

r(KeyError)
x = {}
try: a = x['key']
except KeyError: pass

r(KeyboardInterrupt)
print '(not testable in a script)'

r(MemoryError)
print '(not safe to test)'

r(NameError)
try: x = undefined_variable
except NameError: pass

r(OverflowError)
87 88 89 90 91 92
# XXX
# Obscure:  this test relies on int+int raising OverflowError if the
# ints are big enough.  But ints no longer do that by default.  This
# test will have to go away someday.  For now, we can convert the
# transitional OverflowWarning into an error.
warnings.filterwarnings("error", "", OverflowWarning, __name__)
Guido van Rossum's avatar
Guido van Rossum committed
93 94
x = 1
try:
Fred Drake's avatar
Fred Drake committed
95
    while 1: x = x+x
Guido van Rossum's avatar
Guido van Rossum committed
96 97 98 99 100 101
except OverflowError: pass

r(RuntimeError)
print '(not used any more?)'

r(SyntaxError)
Guido van Rossum's avatar
Guido van Rossum committed
102
try: exec '/\n'
Guido van Rossum's avatar
Guido van Rossum committed
103 104
except SyntaxError: pass

105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
# make sure the right exception message is raised for each of these
# code fragments:

def ckmsg(src, msg):
    try:
        compile(src, '<fragment>', 'exec')
    except SyntaxError, e:
        print e.msg
        if e.msg == msg:
            print "ok"
        else:
            print "expected:", msg
    else:
        print "failed to get expected SyntaxError"

s = '''\
while 1:
    try:
        pass
    finally:
125
        continue
126
'''
Finn Bock's avatar
Finn Bock committed
127 128 129 130 131
if sys.platform.startswith('java'):
    print "'continue' not supported inside 'finally' clause"
    print "ok"
else:
    ckmsg(s, "'continue' not supported inside 'finally' clause")
132 133 134 135 136 137 138 139 140
s = '''\
try:
    continue
except:
    pass
'''
ckmsg(s, "'continue' not properly in loop")
ckmsg("continue\n", "'continue' not properly in loop")

141 142 143 144 145 146 147 148
r(IndentationError)

r(TabError)
# can only be tested under -tt, and is the only test for -tt
#try: compile("try:\n\t1/0\n    \t1/0\nfinally:\n pass\n", '<string>', 'exec')
#except TabError: pass
#else: raise TestFailed

Guido van Rossum's avatar
Guido van Rossum committed
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
r(SystemError)
print '(hard to reproduce)'

r(SystemExit)
import sys
try: sys.exit(0)
except SystemExit: pass

r(TypeError)
try: [] + ()
except TypeError: pass

r(ValueError)
try: x = chr(10000)
except ValueError: pass

r(ZeroDivisionError)
try: x = 1/0
except ZeroDivisionError: pass

169 170 171 172
r(Exception)
try: x = 1/0
except Exception, e: pass

173 174 175 176 177 178 179 180
# test that setting an exception at the C level works even if the
# exception object can't be constructed.

class BadException:
    def __init__(self):
        raise RuntimeError, "can't instantiate BadException"

def test_capi1():
Finn Bock's avatar
Finn Bock committed
181
    import _testcapi
182 183 184 185 186 187 188 189 190 191 192
    try:
        _testcapi.raise_exception(BadException, 1)
    except TypeError, err:
        exc, err, tb = sys.exc_info()
        co = tb.tb_frame.f_code
        assert co.co_name == "test_capi1"
        assert co.co_filename.endswith('test_exceptions.py')
    else:
        print "Expected exception"

def test_capi2():
Finn Bock's avatar
Finn Bock committed
193
    import _testcapi
194 195 196 197 198 199 200 201 202 203 204
    try:
        _testcapi.raise_exception(BadException, 0)
    except RuntimeError, err:
        exc, err, tb = sys.exc_info()
        co = tb.tb_frame.f_code
        assert co.co_name == "__init__"
        assert co.co_filename.endswith('test_exceptions.py')
        co2 = tb.tb_frame.f_back.f_code
        assert co2.co_name == "test_capi2"
    else:
        print "Expected exception"
Finn Bock's avatar
Finn Bock committed
205 206 207 208

if not sys.platform.startswith('java'):
    test_capi1()
    test_capi2()
209

Guido van Rossum's avatar
Guido van Rossum committed
210
unlink(TESTFN)