Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

# 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__