Merge pull request #4444 from RonnyPfannschmidt/fix-4386-2

fix #4386 - handle uninitialized exceptioninfo in repr/str
This commit is contained in:
Bruno Oliveira 2018-11-23 12:40:41 -02:00 committed by GitHub
commit 0b73d6d4f5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 4 deletions

View File

@ -0,0 +1 @@
Handle uninitialized exceptioninfo in repr/str.

View File

@ -425,7 +425,10 @@ class ExceptionInfo(object):
self.traceback = _pytest._code.Traceback(self.tb, excinfo=ref(self))
def __repr__(self):
return "<ExceptionInfo %s tblen=%d>" % (self.typename, len(self.traceback))
try:
return "<ExceptionInfo %s tblen=%d>" % (self.typename, len(self.traceback))
except AttributeError:
return "<ExceptionInfo uninitialized>"
def exconly(self, tryshort=False):
""" return the exception as a string
@ -513,9 +516,13 @@ class ExceptionInfo(object):
return fmt.repr_excinfo(self)
def __str__(self):
entry = self.traceback[-1]
loc = ReprFileLocation(entry.path, entry.lineno + 1, self.exconly())
return str(loc)
try:
entry = self.traceback[-1]
except AttributeError:
return repr(self)
else:
loc = ReprFileLocation(entry.path, entry.lineno + 1, self.exconly())
return str(loc)
def __unicode__(self):
entry = self.traceback[-1]

View File

@ -33,6 +33,23 @@ class TestRaises(object):
except pytest.raises.Exception:
pass
def test_raises_repr_inflight(self):
"""Ensure repr() on an exception info inside a pytest.raises with block works (#4386)"""
class E(Exception):
pass
with pytest.raises(E) as excinfo:
# this test prints the inflight uninitialized object
# using repr and str as well as pprint to demonstrate
# it works
print(str(excinfo))
print(repr(excinfo))
import pprint
pprint.pprint(excinfo)
raise E()
def test_raises_as_contextmanager(self, testdir):
testdir.makepyfile(
"""