用自动包含 try 和 except

问题描述

是否可以定义自己的 with 语句,该语句自动包含 try...except 错误处理? 例如,对此有一个简写会很好:

with Do_Something():
    try:
        ...
    except Exception as e:
        print(str(e))

...看起来像这样:

with Try_Something():
    ...
    

我们如何将 try...except 行为包含到以下 MWE 类中?

class Do_Something():
    def __init__(self):
        pass

    def __enter__(self):
        print('Starting...')
        # invoke "try" somewhere here?
        return(self)

    def __exit__(self,except_type,except_value,tb):
        # invoke "except" somewhere here?

解决方法

根据the docs,如果你想抑制异常,__exit__应该返回True

传递给 __exit__ 的参数将描述异常情况,以防您想做出有条件的决定。

,

看起来 with 本身就带有 try,并将异常作为参数传播给 __exit__(...)。所以这可能是一个合适的解决方案:

import traceback
class Try_Something():
    def __init__(self):
        pass

    def __enter__(self):
        print('Starting...')
        # invoke "try" somewhere here? -- No,"with" automatically invokes "try"
        return(self)

    def __exit__(self,except_type,except_value,tb):
        if not except_type:
            print('finished.')
        else:
            print('failed.')
            traceback.print_exc() # prints error similar to str(e) from the question
        return(True)

我没有找到没有 import traceback 的解决方案。请评论是否有办法使用提供的参数直接打印回溯信息而无需额外模块。