您是否在Python中实现自己的异常?

您是否在Python中实现自己的异常?,python,exception,Python,Exception,您是否在python中实现自己的异常类? 目前,我还没有遇到我遇到麻烦的情况 没有原创的。我的意思是,内置的异常就足够了 自我实现异常的主要好处是什么?如果您想捕获您所创建的特定类型的异常,那么它非常有用。您永远不希望只捕获“异常”,因为您可能正在捕获一些您不知道的其他异常 如果您想捕获您所做的特定类型的异常,那么它非常有用。您永远不希望只捕获“异常”,因为您可能正在捕获一些您不知道的其他异常 通常,您应该定义自己的异常的唯一时间是在特定情况下,在这种情况下,引发自定义异常比引发现有Python

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


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

如果您想捕获您所创建的特定类型的异常,那么它非常有用。您永远不希望只捕获“异常”,因为您可能正在捕获一些您不知道的其他异常

如果您想捕获您所做的特定类型的异常,那么它非常有用。您永远不希望只捕获“异常”,因为您可能正在捕获一些您不知道的其他异常

通常,您应该定义自己的异常的唯一时间是在特定情况下,在这种情况下,引发自定义异常比引发现有Python异常更合适

例如,假设我正在实现一个命令行参数解析API,我需要说明用户输入无效命令行参数的情况,不管它是什么。现在我可以简单地引发一个Python异常,比如
SyntaxError
namererror
,但这将是一个糟糕的设计决策

我希望能够向用户传达引发异常的原因,而不仅仅是引发异常。更好的选择是将通用异常类
exception
子类化,并创建特定的自定义异常。可能
InvalidCommandLineArgument

现在不必使用一般的Python异常,我可以使用我的自定义异常,这有助于清晰、简洁地通知用户他们的错误

如果您希望在代码中的某个操作失败时得到通知,这也很有用。例如,如果您创建一个从internet下载certian文件的函数,它可以引发
NoInternetConnection
异常,在is internet连接关闭时通知您。这允许您根据引发的异常采取特定操作

现在,您可能想知道为什么在第二种情况下,您不能在尝试使用之前简单地使用条件语句来测试是否存在internet连接。之所以选择后者而不是前者,是因为Python中的格言“请求原谅比请求许可更容易”。这基本上意味着,如果抛出异常,请Python捕获异常比使用条件语句小心翼翼地绕过所有可能的错误更容易


最后,它不是关于“您在Python中实现自己的异常吗?”,而是关于“您什么时候在Python中实现自己的异常?”

一般来说,您应该定义自己的异常的唯一时间是在特定情况下,在这种情况下,引发自定义异常比引发现有Python异常更合适

例如,假设我正在实现一个命令行参数解析API,我需要说明用户输入无效命令行参数的情况,不管它是什么。现在我可以简单地引发一个Python异常,比如
SyntaxError
namererror
,但这将是一个糟糕的设计决策

我希望能够向用户传达引发异常的原因,而不仅仅是引发异常。更好的选择是将通用异常类
exception
子类化,并创建特定的自定义异常。可能
InvalidCommandLineArgument

现在不必使用一般的Python异常,我可以使用我的自定义异常,这有助于清晰、简洁地通知用户他们的错误

如果您希望在代码中的某个操作失败时得到通知,这也很有用。例如,如果您创建一个从internet下载certian文件的函数,它可以引发
NoInternetConnection
异常,在is internet连接关闭时通知您。这允许您根据引发的异常采取特定操作

现在,您可能想知道为什么在第二种情况下,您不能在尝试使用之前简单地使用条件语句来测试是否存在internet连接。之所以选择后者而不是前者,是因为Python中的格言“请求原谅比请求许可更容易”。这基本上意味着,如果抛出异常,请Python捕获异常比使用条件语句小心翼翼地绕过所有可能的错误更容易


最后,它不是关于“您是否在Python中实现自己的异常?”,而是关于“您何时在Python中实现自己的异常?”

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

class NumberTooBig(ValueError):
    pass

class NumberTooSmall(ValueError):
    pass

try:
    ...
except NumberTooBig:
    ...
except NumberTooSmall:
    ...


对于自定义异常,可以在异常类型本身中嵌入有关错误的信息,这样可以更容易地仅捕获所需的特定错误,而不必记住重新引发意外捕获的任何错误。

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

class NumberTooBig(ValueError):
    pass

class NumberTooSmall(ValueError):
    pass

try:
    ...
except NumberTooBig:
    ...
except NumberTooSmall:
    ...


对于自定义异常,可以将有关错误的信息嵌入异常本身的类型中,这使得只捕获所需的特定错误变得更容易,而不必记住重新引发意外捕获的任何错误。

当您希望将信息传递回调用您的代码的其他人时,最好使用自定义异常,以便他们知道该怎么做

例如:

假设我编写了一个模块
pet\u store
,它提供了一个
get\u dog(type)
函数,您调用了它

当我编写函数时,可能有某些方法会导致失败:

NoDogsLeftException  # Sold out of all dogs
NoDogsOfBreedException  # Sold out of that breed
OwnerHouseCheckException  # We checked your house and it's disgusting. Clean up you slob
现在,当你
导入宠物店
宠物店。获取狗(“吉娃娃”)
时,我可能会抛出一个