mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	 ede049b2d3
			
		
	
	
		ede049b2d3
		
	
	
	
	
		
			
			Add raise_exception() to the _testcapi module. It isn't a test, but the C API exists only to support test_exceptions. raise_exception() takes two arguments -- an exception class and an integer specifying how many arguments it should be called with. test_exceptions uses BadException() to test the interpreter's behavior when there is a problem instantiating the exception. test_capi1() calls it with too many arguments. test_capi2() causes an exception to be raised in the Python code of the constructor.
		
			
				
	
	
		
			199 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Python test set -- part 5, built-in exceptions
 | |
| 
 | |
| from test_support import *
 | |
| from types import ClassType
 | |
| import warnings
 | |
| import sys, traceback
 | |
| import _testcapi
 | |
| 
 | |
| warnings.filterwarnings("error", "", OverflowWarning, __name__)
 | |
| 
 | |
| print '5. Built-in exceptions'
 | |
| # XXX This is not really enough, each *operation* should be tested!
 | |
| 
 | |
| # 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
 | |
| 
 | |
| 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
 | |
| 
 | |
| def r(thing):
 | |
|     test_raise_catch(thing)
 | |
|     if isinstance(thing, ClassType):
 | |
|         print thing.__name__
 | |
|     else:
 | |
|         print thing
 | |
| 
 | |
| 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:
 | |
|     try:
 | |
|         sys.stdin = fp
 | |
|         x = raw_input()
 | |
|     except EOFError:
 | |
|         pass
 | |
| finally:
 | |
|     sys.stdin = savestdin
 | |
|     fp.close()
 | |
| 
 | |
| 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)
 | |
| x = 1
 | |
| try:
 | |
|     while 1: x = x+x
 | |
| except OverflowError: pass
 | |
| 
 | |
| r(RuntimeError)
 | |
| print '(not used any more?)'
 | |
| 
 | |
| r(SyntaxError)
 | |
| try: exec '/\n'
 | |
| except SyntaxError: pass
 | |
| 
 | |
| # 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:
 | |
|         continue
 | |
| '''
 | |
| ckmsg(s, "'continue' not supported inside 'finally' clause")
 | |
| s = '''\
 | |
| try:
 | |
|     continue
 | |
| except:
 | |
|     pass
 | |
| '''
 | |
| ckmsg(s, "'continue' not properly in loop")
 | |
| ckmsg("continue\n", "'continue' not properly in loop")
 | |
| 
 | |
| 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
 | |
| 
 | |
| 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
 | |
| 
 | |
| r(Exception)
 | |
| try: x = 1/0
 | |
| except Exception, e: pass
 | |
| 
 | |
| # 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():
 | |
|     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"
 | |
| test_capi1()
 | |
| 
 | |
| def test_capi2():
 | |
|     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"
 | |
| test_capi2()
 | |
| 
 | |
| unlink(TESTFN)
 |