mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Merge #17413: make sure settrace funcs get passed exception instances for 'value'.
Patch by Ingrid Cheung and Brendan McLoughlin.
This commit is contained in:
		
						commit
						f097f175dd
					
				
					 4 changed files with 30 additions and 0 deletions
				
			
		|  | @ -458,6 +458,29 @@ def g(frame, why, extra): | |||
|             self.fail("exception not propagated") | ||||
| 
 | ||||
| 
 | ||||
|     def test_exception_arguments(self): | ||||
|         def f(): | ||||
|             x = 0 | ||||
|             # this should raise an error | ||||
|             x.no_such_attr | ||||
|         def g(frame, event, arg): | ||||
|             if (event == 'exception'): | ||||
|                 type, exception, trace = arg | ||||
|                 self.assertIsInstance(exception, Exception) | ||||
|             return g | ||||
| 
 | ||||
|         existing = sys.gettrace() | ||||
|         try: | ||||
|             sys.settrace(g) | ||||
|             try: | ||||
|                 f() | ||||
|             except AttributeError: | ||||
|                 # this is expected | ||||
|                 pass | ||||
|         finally: | ||||
|             sys.settrace(existing) | ||||
| 
 | ||||
| 
 | ||||
| # 'Jump' tests: assigning to frame.f_lineno within a trace function | ||||
| # moves the execution position - it's how debuggers implement a Jump | ||||
| # command (aka. "Set next statement"). | ||||
|  |  | |||
|  | @ -211,6 +211,7 @@ David Chaum | |||
| Nicolas Chauvat | ||||
| Jerry Chen | ||||
| Michael Chermside | ||||
| Ingrid Cheung | ||||
| Albert Chin-A-Young | ||||
| Adal Chiriliuc | ||||
| Matt Chisholm | ||||
|  | @ -802,6 +803,7 @@ Chris McDonough | |||
| Greg McFarlane | ||||
| Alan McIntyre | ||||
| Michael McLay | ||||
| Brendan McLoughlin | ||||
| Mark Mc Mahon | ||||
| Gordon McMillan | ||||
| Andrew McNamara | ||||
|  |  | |||
|  | @ -10,6 +10,10 @@ What's New in Python 3.4.0 Alpha 1? | |||
| Core and Builtins | ||||
| ----------------- | ||||
| 
 | ||||
| - Issue #17413: sys.settrace callbacks were being passed a string instead of an | ||||
|   exception instance for the 'value' element of the arg tuple if the exception | ||||
|   originated from C code; now an exception instance is always provided. | ||||
| 
 | ||||
| - Issue #17782: Fix undefined behaviour on platforms where | ||||
|   ``struct timespec``'s "tv_nsec" member is not a C long. | ||||
| 
 | ||||
|  |  | |||
|  | @ -3793,6 +3793,7 @@ call_exc_trace(Py_tracefunc func, PyObject *self, PyFrameObject *f) | |||
|         value = Py_None; | ||||
|         Py_INCREF(value); | ||||
|     } | ||||
|     PyErr_NormalizeException(&type, &value, &traceback); | ||||
|     arg = PyTuple_Pack(3, type, value, traceback); | ||||
|     if (arg == NULL) { | ||||
|         PyErr_Restore(type, value, traceback); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 R David Murray
						R David Murray