编写许多 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:
- 您执行的代码可能会引发异常;
- 如果是,则您对异常做出反应。
一个简单的例子来说明我的意思,假设我有 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:
- 您执行的代码可能会引发异常;
- 如果是,则您对异常做出反应。