| 
									
										
										
										
											1992-01-27 17:00:37 +00:00
										 |  |  | # Python test set -- part 5, built-in exceptions | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-30 23:27:12 +00:00
										 |  |  | from test.test_support import TestFailed, TESTFN, unlink | 
					
						
							| 
									
										
										
										
											1997-08-29 21:58:25 +00:00
										 |  |  | from types import ClassType | 
					
						
							| 
									
										
										
										
											2001-08-23 03:23:03 +00:00
										 |  |  | import warnings | 
					
						
							| 
									
										
										
										
											2003-05-10 07:36:56 +00:00
										 |  |  | import sys, traceback, os | 
					
						
							| 
									
										
										
										
											2001-08-23 03:23:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-01-27 17:00:37 +00:00
										 |  |  | print '5. Built-in exceptions' | 
					
						
							|  |  |  | # XXX This is not really enough, each *operation* should be tested! | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-13 23:07:00 +00:00
										 |  |  | # 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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-20 18:52:57 +00:00
										 |  |  | 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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-08-29 21:58:25 +00:00
										 |  |  | def r(thing): | 
					
						
							| 
									
										
										
										
											2000-06-20 18:52:57 +00:00
										 |  |  |     test_raise_catch(thing) | 
					
						
							| 
									
										
										
										
											2000-09-01 06:53:52 +00:00
										 |  |  |     if isinstance(thing, ClassType): | 
					
						
							| 
									
										
										
										
											1998-03-26 19:42:58 +00:00
										 |  |  |         print thing.__name__ | 
					
						
							| 
									
										
										
										
											1997-08-29 21:58:25 +00:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											1998-03-26 19:42:58 +00:00
										 |  |  |         print thing | 
					
						
							| 
									
										
										
										
											1992-01-27 17:00:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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: | 
					
						
							| 
									
										
										
										
											2000-10-23 17:00:30 +00:00
										 |  |  |     try: | 
					
						
							|  |  |  |         sys.stdin = fp | 
					
						
							|  |  |  |         x = raw_input() | 
					
						
							|  |  |  |     except EOFError: | 
					
						
							|  |  |  |         pass | 
					
						
							| 
									
										
										
										
											1992-01-27 17:00:37 +00:00
										 |  |  | finally: | 
					
						
							| 
									
										
										
										
											2000-10-23 17:00:30 +00:00
										 |  |  |     sys.stdin = savestdin | 
					
						
							|  |  |  |     fp.close() | 
					
						
							| 
									
										
										
										
											1992-01-27 17:00:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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) | 
					
						
							| 
									
										
										
										
											2002-04-16 01:27:44 +00:00
										 |  |  | # 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__) | 
					
						
							| 
									
										
										
										
											1992-01-27 17:00:37 +00:00
										 |  |  | x = 1 | 
					
						
							|  |  |  | try: | 
					
						
							| 
									
										
										
										
											2000-10-23 17:00:30 +00:00
										 |  |  |     while 1: x = x+x | 
					
						
							| 
									
										
										
										
											1992-01-27 17:00:37 +00:00
										 |  |  | except OverflowError: pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | r(RuntimeError) | 
					
						
							|  |  |  | print '(not used any more?)' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | r(SyntaxError) | 
					
						
							| 
									
										
										
										
											1995-08-11 14:24:47 +00:00
										 |  |  | try: exec '/\n' | 
					
						
							| 
									
										
										
										
											1992-01-27 17:00:37 +00:00
										 |  |  | except SyntaxError: pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-08 16:32:34 +00:00
										 |  |  | # 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: | 
					
						
							| 
									
										
										
										
											2001-02-01 22:48:12 +00:00
										 |  |  |         continue | 
					
						
							| 
									
										
										
										
											2000-09-08 16:32:34 +00:00
										 |  |  | '''
 | 
					
						
							| 
									
										
										
										
											2001-12-08 10:15:48 +00:00
										 |  |  | if sys.platform.startswith('java'): | 
					
						
							|  |  |  |     print "'continue' not supported inside 'finally' clause" | 
					
						
							|  |  |  |     print "ok" | 
					
						
							|  |  |  | else: | 
					
						
							|  |  |  |     ckmsg(s, "'continue' not supported inside 'finally' clause") | 
					
						
							| 
									
										
										
										
											2000-09-08 16:32:34 +00:00
										 |  |  | s = '''\
 | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     continue | 
					
						
							|  |  |  | except: | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | '''
 | 
					
						
							|  |  |  | ckmsg(s, "'continue' not properly in loop") | 
					
						
							|  |  |  | ckmsg("continue\n", "'continue' not properly in loop") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-11 17:53:00 +00:00
										 |  |  | 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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-01-27 17:00:37 +00:00
										 |  |  | 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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-05-25 23:16:54 +00:00
										 |  |  | r(Exception) | 
					
						
							|  |  |  | try: x = 1/0 | 
					
						
							|  |  |  | except Exception, e: pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-09-26 20:01:13 +00:00
										 |  |  | # 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(): | 
					
						
							| 
									
										
										
										
											2001-12-08 10:15:48 +00:00
										 |  |  |     import _testcapi | 
					
						
							| 
									
										
										
										
											2001-09-26 20:01:13 +00:00
										 |  |  |     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" | 
					
						
							| 
									
										
										
										
											2003-05-10 07:36:56 +00:00
										 |  |  |         assert co.co_filename.endswith('test_exceptions'+os.extsep+'py') | 
					
						
							| 
									
										
										
										
											2001-09-26 20:01:13 +00:00
										 |  |  |     else: | 
					
						
							|  |  |  |         print "Expected exception" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_capi2(): | 
					
						
							| 
									
										
										
										
											2001-12-08 10:15:48 +00:00
										 |  |  |     import _testcapi | 
					
						
							| 
									
										
										
										
											2001-09-26 20:01:13 +00:00
										 |  |  |     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__" | 
					
						
							| 
									
										
										
										
											2003-05-10 07:36:56 +00:00
										 |  |  |         assert co.co_filename.endswith('test_exceptions'+os.extsep+'py') | 
					
						
							| 
									
										
										
										
											2001-09-26 20:01:13 +00:00
										 |  |  |         co2 = tb.tb_frame.f_back.f_code | 
					
						
							|  |  |  |         assert co2.co_name == "test_capi2" | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         print "Expected exception" | 
					
						
							| 
									
										
										
										
											2001-12-08 10:15:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if not sys.platform.startswith('java'): | 
					
						
							|  |  |  |     test_capi1() | 
					
						
							|  |  |  |     test_capi2() | 
					
						
							| 
									
										
										
										
											2001-09-26 20:01:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-01-27 17:00:37 +00:00
										 |  |  | unlink(TESTFN) |