更改用户定义功能的错误类型

时间:2019-04-09 08:55:07

标签: python error-handling

是否有一种情况,您会捕获一个错误并将其引发为另一个错误。例如,如果我有一个从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)

1 个答案:

答案 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:一个由错误的参数数量引起。这种错误的异常处理会阻碍调试。