【问题标题】:Is there a best practice to be followed when writing many try-except blocks?在编写许多 try-except 块时是否有最佳实践可以遵循?
【发布时间】:2021-07-03 23:07:37
【问题描述】:

一个简单的例子来说明我的意思,假设我有 3 个 .py 文件(file1、file2、file3)为我执行不同的任务,并且我需要在每一步都记录错误,这是正确的方法吗是这样做还是有其他可以遵循的最佳实践?

file1.py:

def some_function(some_var):
    try:
        if some_var == 0:
            raise ValueError("Can't be zero")
        else:
            return 1
    except ValueError:
        raise

file2.py

import file1

def some_other_fn(some_other_var):
    try:
        return file1.some_function(some_other_var)
    except:
        raise

file3.py

import file2
import traceback

try:
    res = f2.some_other_fn(0)
except:
    # handle err
    print(traceback.format_exc())

当然,另一个问题是,当我重新提出我在 file1 中可能遇到的多种类型的错误(比如说 4+)时,我是否应该在不同的文件中捕获相同的 4 个错误?这似乎是多余的代码。有没有办法让我知道在 file3 中 file1 发生了什么样的错误,而无需在 file2 和 file3 中都明确写入except ValueError

请注意,file1和file2不能退出,file3是主控制流,其他函数必须返回。

【问题讨论】:

    标签: python python-3.x error-handling error-logging try-except


    【解决方案1】:

    您似乎不了解 try-except 的工作原理。请重复您的教程以获取示例。由于基本代码 not 有可能引发运行时错误,因此 try-except 构造是不合适的。手动引发异常是愚蠢的,将其包装在 try-except 块中,只是为了重新引发相同的异常。

    改为:

    def some_function(some_var):
        if some_var == 0:
            raise ValueError("Can't be zero")
        else:
            return 1
    

    同样,您的下一个函数有一个功能为空的 try-except 块。您不会以任何方式专门处理异常,因此您所做的只是复制默认的异常传播——运行时系统已经这样做了。

    改为:

    import file1
    
    def some_other_fn(some_other_var):
        return file1.some_function(some_other_var)
    

    在你的最后一个块中,你终于正确地使用了 try-except:

    1. 您执行的代码可能会引发异常;
    2. 如果是这样,那么您对异常做出反应。

    【讨论】:

    • 对于更多的布朗尼点,文件 3 中的异常语句应该只排除 ValueError
    • 正如给定的那样,是的——我允许更广泛的应用,但你说得很对,我至少应该提出(咳咳)这一点。
    • 我明白了,我错误地理解了 try-except 的工作原理。内容丰富的答案。
    猜你喜欢
    • 2019-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    相关资源
    最近更新 更多