How to profile exception handling in Python?

Is there a way to find out how many exceptions are thrown (and caught), and maybe how long does the exception handling take?

I use pyparsing (slightly modified), which is heavily dependent on exceptions, and I want to know (or at least evaluate) if it would be wise to rewrite it to work without exceptions.

Raising and catching exceptions is widely scattered modulo, so I'm looking for a way that does not require changing each try-except-block parameter

+4
source share
1 answer

, , , , .

import time
from contextlib import contextmanager

# global
NUMBER_OF_EXCEPTIONS = 0

# define the timer
class Timer(object):
    def __init__(self):
        self.t1 = time.time()
    def stop(self):
        self.t2 = time.time()
        self.elapsed = self.t2 - self.t1

# define the profiler
@contextmanager
def profiler():
    t = Timer()
    yield t
    t.stop()
    print("elapsed: ", t.elapsed)

# use the profiler!
with profiler():
    try:
        1/0
    except ZeroDivisionError:
        # handle exception
        NUMBER_OF_EXCEPTIONS += 1
        time.sleep(1.1)

# and use it again!
with profiler():
    try:
        1/2
    except ZeroDivisionError:
        # handle exception
        NUMBER_OF_EXCEPTIONS += 1
        time.sleep(1.1)

print("Total handled exceptions: ", NUMBER_OF_EXCEPTIONS)

:

elapsed:  1.10120511055
elapsed:  4.05311584473e-06
Total handled exceptions:  1

, - , (source). :

NUMBER_OF_EXCEPTIONS = 0

@contextmanager
def handle_zero_division_error():
    try:
        yield
    except ZeroDivisionError as err:
        global NUMBER_OF_EXCEPTIONS
        NUMBER_OF_EXCEPTIONS += 1
        time.sleep(1.1)

with profiler():
    with handle_zero_division_error():
        1/0

with profiler():
    with handle_zero_division_error():
        1/0

# you can even write it like this
with profiler(), handle_zero_division_error():
    1/2

print("Total handled exceptions: ", NUMBER_OF_EXCEPTIONS)

:

elapsed:  1.10123705864
elapsed:  1.10085892677
elapsed:  1.90734863281e-05
Total handled exceptions:  2
0

All Articles