首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python中分析异常处理?

如何在Python中分析异常处理?
EN

Stack Overflow用户
提问于 2013-12-28 18:43:22
回答 1查看 205关注 0票数 3

有没有办法找出抛出(和捕获)了多少异常,以及异常处理花费了多少时间?

我使用的是pyparsing (略微修改),它在很大程度上依赖于异常,我想找出(或至少估计)是否值得花时间重写它,以便在没有异常的情况下工作。

异常的引发和捕获广泛地分散在模块中,所以我正在寻找一种不需要修改每个try-except block的方法

EN

回答 1

Stack Overflow用户

发布于 2013-12-28 19:33:36

每当您想分析代码时,使用contextmanager可能是个好主意。

代码语言:javascript
复制
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)

输出应如下所示:

代码语言:javascript
复制
elapsed:  1.10120511055
elapsed:  4.05311584473e-06
Total handled exceptions:  1

现在,如果你想变得更花哨,你也可以编写上下文管理器来处理你的异常(source)。这种技术可以产生非常干净的代码:

代码语言:javascript
复制
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)

和输出:

代码语言:javascript
复制
elapsed:  1.10123705864
elapsed:  1.10085892677
elapsed:  1.90734863281e-05
Total handled exceptions:  2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20813601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档