diff -r aa214fefbdc1 Lib/test/test_raise.py --- a/Lib/test/test_raise.py Sat Jan 28 20:33:52 2012 -0500 +++ b/Lib/test/test_raise.py Sat Jan 28 23:23:44 2012 -0800 @@ -77,6 +77,16 @@ class TestRaise(unittest.TestCase): nested_reraise() self.assertRaises(TypeError, reraise) + def test_raise_from_None(self): + try: + try: + raise TypeError("foo") + except: + raise ValueError() from None + except ValueError as e: + self.assertTrue(isinstance(e.__context__, TypeError)) + self.assertTrue(e.__cause__) + def test_with_reraise1(self): def reraise(): try: diff -r aa214fefbdc1 Python/ceval.c --- a/Python/ceval.c Sat Jan 28 20:33:52 2012 -0500 +++ b/Python/ceval.c Sat Jan 28 23:23:44 2012 -0800 @@ -3576,6 +3576,11 @@ do_raise(PyObject *exc, PyObject *cause) else if (PyExceptionInstance_Check(cause)) { fixed_cause = cause; } + else if (cause == Py_None) { + fixed_cause = Py_True; + Py_INCREF(Py_True); + Py_DECREF(cause); + } else { PyErr_SetString(PyExc_TypeError, "exception causes must derive from " diff -r aa214fefbdc1 Python/pythonrun.c --- a/Python/pythonrun.c Sat Jan 28 20:33:52 2012 -0500 +++ b/Python/pythonrun.c Sat Jan 28 23:23:44 2012 -0800 @@ -1691,7 +1691,11 @@ print_exception_recursive(PyObject *f, P else if (PyExceptionInstance_Check(value)) { cause = PyException_GetCause(value); context = PyException_GetContext(value); - if (cause) { + if (cause && cause == Py_True) { + /* print neither cause nor context */ + ; + } + else if (cause) { res = PySet_Contains(seen, cause); if (res == -1) PyErr_Clear();