编写许多 try-except 块时是否有最佳实践可以遵循?

Is there a best practice to be followed when writing many try-except blocks?

一个简单的例子来说明我的意思,假设我有 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 是主要的控制流,其他函数必须 return 它。

您似乎不了解 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 块。您没有以任何方式专门处理异常,所以您所做的只是复制默认的异常传播——运行-time 系统已经这样做了。

改为:

import file1

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

在最后一个块中,您最终正确使用了 try-except:

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