Python Code Auditing Tool

System Administrator skip at pobox.com
Wed Feb 2 11:03:12 EST 2005


    >> Does anybody know of a tool that can tell me all possible exceptions
    >> that might occur in each line of code?  What I'm hoping to find is
    >> something like the following:

    Paul> That is impossible.  The parameter to the raise statement is a
    Paul> class object, which can be anything.

Sure, but in all but the rarest of cases the first arg to raise is a
specific exception, probably one of the standard exceptions.  In the Python
code in the distribution (ignoring the test directory where all sorts of
mischief is done to stress things), here are the most common words following
"raise" where "raise" is the first word on the line:

    % find . -name '*.py' \
    > | egrep -v '\./test' \
    > | xargs egrep '^ *raise ' \
    > | awk '{print $3}' \
    > | sed -e 's/[(,].*//' \
    > | sort \
    > | uniq -c \
    > | sort -rn \
    > | head -15
     246 ValueError
     227 aetools.Error
     216 Error
     124 TypeError
     101 error
      75 RuntimeError
      53 IOError
      36 NotImplementedError
      36 ImportError
      36 EOFError
      31 SyntaxError
      23 KeyError
      23 AttributeError
      22 DistutilsPlatformError
      21 UnicodeError

Without checking, my guess is that #5 ("error") is one of a handful of
exception classes defined at module scope (ftplib, anydbm, sre_constants,
poplib, among others all define such an exception class), and not a variable
that accepts multiple values as in your example.

In short, while not perfect, simply grepping for '^ *(class|def|raise) ' and
printing the first and second words of each output line would probably give
you a pretty good idea of what gets raised where.

Skip



More information about the Python-list mailing list