Merge pull request #4444 from RonnyPfannschmidt/fix-4386-2
fix #4386 - handle uninitialized exceptioninfo in repr/str
This commit is contained in:
		
						commit
						0b73d6d4f5
					
				| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
Handle uninitialized exceptioninfo in repr/str.
 | 
			
		||||
| 
						 | 
				
			
			@ -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]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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(
 | 
			
		||||
            """
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue