82 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
# copied from python-2.7.3's traceback.py
 | 
						|
# CHANGES:
 | 
						|
# - some_str is replaced, trying to create unicode strings
 | 
						|
#
 | 
						|
import types
 | 
						|
 | 
						|
def format_exception_only(etype, value):
 | 
						|
    """Format the exception part of a traceback.
 | 
						|
 | 
						|
    The arguments are the exception type and value such as given by
 | 
						|
    sys.last_type and sys.last_value. The return value is a list of
 | 
						|
    strings, each ending in a newline.
 | 
						|
 | 
						|
    Normally, the list contains a single string; however, for
 | 
						|
    SyntaxError exceptions, it contains several lines that (when
 | 
						|
    printed) display detailed information about where the syntax
 | 
						|
    error occurred.
 | 
						|
 | 
						|
    The message indicating which exception occurred is always the last
 | 
						|
    string in the list.
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
    # An instance should not have a meaningful value parameter, but
 | 
						|
    # sometimes does, particularly for string exceptions, such as
 | 
						|
    # >>> raise string1, string2  # deprecated
 | 
						|
    #
 | 
						|
    # Clear these out first because issubtype(string1, SyntaxError)
 | 
						|
    # would throw another exception and mask the original problem.
 | 
						|
    if (isinstance(etype, BaseException) or
 | 
						|
        isinstance(etype, types.InstanceType) or
 | 
						|
        etype is None or type(etype) is str):
 | 
						|
        return [_format_final_exc_line(etype, value)]
 | 
						|
 | 
						|
    stype = etype.__name__
 | 
						|
 | 
						|
    if not issubclass(etype, SyntaxError):
 | 
						|
        return [_format_final_exc_line(stype, value)]
 | 
						|
 | 
						|
    # It was a syntax error; show exactly where the problem was found.
 | 
						|
    lines = []
 | 
						|
    try:
 | 
						|
        msg, (filename, lineno, offset, badline) = value.args
 | 
						|
    except Exception:
 | 
						|
        pass
 | 
						|
    else:
 | 
						|
        filename = filename or "<string>"
 | 
						|
        lines.append('  File "%s", line %d\n' % (filename, lineno))
 | 
						|
        if badline is not None:
 | 
						|
            if isinstance(badline, bytes):  # python 2 only
 | 
						|
                badline = badline.decode('utf-8', 'replace')
 | 
						|
            lines.append(u'    %s\n' % badline.strip())
 | 
						|
            if offset is not None:
 | 
						|
                caretspace = badline.rstrip('\n')[:offset].lstrip()
 | 
						|
                # non-space whitespace (likes tabs) must be kept for alignment
 | 
						|
                caretspace = ((c.isspace() and c or ' ') for c in caretspace)
 | 
						|
                # only three spaces to account for offset1 == pos 0
 | 
						|
                lines.append('   %s^\n' % ''.join(caretspace))
 | 
						|
        value = msg
 | 
						|
 | 
						|
    lines.append(_format_final_exc_line(stype, value))
 | 
						|
    return lines
 | 
						|
 | 
						|
def _format_final_exc_line(etype, value):
 | 
						|
    """Return a list of a single line -- normal case for format_exception_only"""
 | 
						|
    valuestr = _some_str(value)
 | 
						|
    if value is None or not valuestr:
 | 
						|
        line = "%s\n" % etype
 | 
						|
    else:
 | 
						|
        line = "%s: %s\n" % (etype, valuestr)
 | 
						|
    return line
 | 
						|
 | 
						|
def _some_str(value):
 | 
						|
    try:
 | 
						|
        return unicode(value)
 | 
						|
    except Exception:
 | 
						|
        try:
 | 
						|
            return str(value)
 | 
						|
        except Exception:
 | 
						|
            pass
 | 
						|
    return '<unprintable %s object>' % type(value).__name__
 |