有没有办法找出抛出(和捕获)了多少异常,以及异常处理花费了多少时间?
我使用的是pyparsing (略微修改),它在很大程度上依赖于异常,我想找出(或至少估计)是否值得花时间重写它,以便在没有异常的情况下工作。
异常的引发和捕获广泛地分散在模块中,所以我正在寻找一种不需要修改每个try-except block的方法
发布于 2013-12-28 19:33:36
每当您想分析代码时,使用contextmanager可能是个好主意。
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: 2https://stackoverflow.com/questions/20813601
复制相似问题