您是否在Python中实现了自己的Exception?

Pyt*_*ner 0 python exception

您是否在python中实现自己的异常类?
目前,我还没有遇到
没有原始设备而遇到麻烦的情况。我的意思是,内置Exception就足够了。

自我实现的Exception的主要好处是什么?

Chr*_*ean 5

通常,只有当您遇到特殊情况时才应定义自己的异常,在这种情况下,引发自定义异常比引发现有的Python异常更为合适。

例如,假设我正在实现一个命令行参数解析API,并且我需要考虑用户输入无效命令行参数的情况,无论它是什么。现在,我可以简单地引发类似SyntaxError或的Python异常NameError,但这将是一个错误的设计决策。

我希望能够向用户传达为什么引发异常,而不仅仅是引发异常。更好的选择是将常规异常类作为子类Exception,并创建特定的自定义异常。也许吧InvalidCommandLineArgument

现在,我不必使用一般的Python异常,而可以使用我的自定义异常,该异常有助于将用户的错误清楚明确地告知用户。

如果您希望在代码中某个操作失败时得到通知,这也很有用。例如,如果您创建了一个从Internet下载证书文件的功能,则NoInternetConnection当Internet连接断开时,它会引发异常通知您。这使您可以根据引发的异常采取某种措施。

现在,您可能想知道为什么在第二种情况下不能在尝试使用条件语句之前简单地使用条件语句来测试是否存在Internet连接。之所以选择后一种而不是前一种,是因为Python的座右铭是“寻求宽恕比寻求许可容易”。从根本上讲,这意味着与使用条件语句来尝试解决所有可能的错误相比,要求Python在引发异常时捕获异常要容易得多。

最后,它不是“ 难道你实现自己的异常在Python?”,而是“ 你在Python中实现自己的异常?”


che*_*ner 5

自定义异常可以清楚地区分不同类型的错误。比较

class NumberTooBig(ValueError):
    pass

class NumberTooSmall(ValueError):
    pass

try:
    ...
except NumberTooBig:
    ...
except NumberTooSmall:
    ...
Run Code Online (Sandbox Code Playgroud)

try:
    ...
except ValueError as exc:
    if str(exc) == "too big":
        ...
    elif str(exc) == "too small":
        ...
    else:
        # A different ValueError I don't know how to handle
        raise exc
Run Code Online (Sandbox Code Playgroud)

使用自定义异常,您可以在异常本身的类型中嵌入有关错误的信息,这样可以更轻松地仅捕获您想要的特定错误,而不必记住重新引发您意外捕获的任何错误。