我应该使用内置异常还是定义自己的异常?

时间:2018-09-17 14:58:29

标签: python zen-of-python

我具有以下方法或功能:

findSomething(v)

是否在我什么都找不到的情况下引发KeyError还是最好定义自己的异常?你觉得呢?

我知道,这绝对不是技术问题,但他们说:“可读性很重要”,我需要知道其他人的想法。 :)

3 个答案:

答案 0 :(得分:1)

如果错误的性质很复杂,并且在代码的其他地方也重复使用了该错误,则我将定义一个自定义错误。

只是因为这样更容易阅读:

raise MyError('reason for MyError')

比:

raise ValueError('the is an Error of type MyError, and here is the reason...')

但是,如果它不是代码的可重复部分,并且错误很明显,我将使用ValueError(在KeyError之前)。

答案 1 :(得分:1)

可能基于观点而关闭,但是。

我更喜欢将KeyErrorValueError等限制为局部范围,即不大于1个函数内部,最好是内部的逻辑块。

假设您在发生异常的原始位置几层之内捕获到一个KeyError。 它基本上不给您任何信息,并且基本上可以在任何地方发生。 一个调用另一个函数的函数不应该知道被调用者的实现细节。 另外,您不是要编写代码来检查异常堆栈跟踪并在代码逻辑中使用它,对吗?

定义自定义异常使您有机会描述问题的位置和高级解释,例如UserNotFoundNoMatchingChannel。 您将在其中找到的代码将使您更深入地了解问题所在以及如何处理它。

答案 2 :(得分:1)

好吧,我想可读性与代码的编写,说出变量,函数的名称等,代码的结构和注释的方式有关。

但是,关于您遇到的异常处理问题:我认为这些是您应该考虑的事情:

1-如果该函数获得有效输入且未找到任何内容,则不应引发或定义异常。您只需要返回一个表示您什么都没有找到的值和/或只打印一条正确的消息即可。

2-如果输入参数v无效(取决于它是从类实例化的对象还是仅是原始类型的对象),则可以分别为其定义适当的异常或仅捕获内置异常。 / p>