是否有一种情况,您会捕获一个错误并将其引发为另一个错误。例如,如果我有一个从excel文件中读取工作表的函数:
import pandas as pd
from xlrd import XLRDError
def readSheet(sheet, path):
try:
print("Reading {} sheet".format(sheet))
return pd.read_excel(path, sheet_name=sheet)
except XLRDError:
raise ValueError("Sheet {0} not in {1}".format(sheet,path)))
我的思维过程是,这会为函数电子表格中的工作表变量引发一个值错误。将此错误保留为XLRDError是否更合适,即
except XLRDError:
raise XLRDError("message")
也许最后一个更普遍的想法是执行这种异常处理是否是惯用的python?相反,最好让函数pd.read_excel处理并引发错误,例如:
def readSheet(sheet,path):
#let any error handling be performed by the read_excel function.
return pd.read_excel(path,sheet_name=sheet)
答案 0 :(得分:1)
通常,是的,其中调用函数比被调用函数更了解可能出问题的地方。
例如,假设您正在从Pyspark的Parquet存档中阅读。碰巧的是,如果您尝试读取一个 empty 文件夹,Pyspark将引发一个AnalysisException
,抱怨它无法推断Parquet模式,必须手动指定。
如果您知道这是最可能的原因,则可以捕获该错误并提出其他更具描述性的错误,或使用raise X from Y
语法保留该追溯。
另一面是,您应该确保已处理所有可能发生此类异常的情况。考虑以下情况:
def my_sum(a, b):
return a + b
try:
my_sum(1, 'one')
except TypeError:
raise TypeError('Unsupported addition operation!')
在这里,引发并捕获了由于试图添加两个未定义加法而产生的TypeError
。但是,以下代码也会 引发TypeError
,但回溯没有意义:
>>> my_sum(1)
TypeError: Unsupported addition operation!
这是完全不同的 TypeError
:一个由错误的参数数量引起。这种错误的异常处理会阻碍调试。