当我们不得不处理异常时,引发异常有什么意义呢?是因为引发异常使您可以创建自己定义的异常吗?
except:
raise ZeroDivisionError
vs。
except ZeroDivisionError:
#code
答案 0 :(得分:1)
如果您将异常视为抛掷和接球,也许会有所帮助。一个人扔球,其他人接球。只是有些人只想打棒球,而另一些人只想打篮球,而且如果有人扔高尔夫球,也许没人在附近打篮球。
以此类推,查看以下三个语法片段:
raise SomeException:
引发异常(特定类型的球,例如仅投掷网球)。except:
捕获所有异常(无论类型如何)。这等于有人捕捉任何类型的球,无论如何。如果您可以给他们扔一个台球,他们就会接住。except SomeException:
只会捕获特定于 类型的异常(例如只会打棒球并且会忽略其他任何东西的人)。然后,以下代码
try:
# ...
except:
raise ZeroDivisionError
做两件分开的事情。首先,它捕获所有异常。然后,当它捕获到异常时,它会引发一个新异常。
就好像有人站在运动场上一样,他会扔篮球,棒球,网球,台球以及任何扔给它的东西,但是每当他们碰到一个球,他们就会毫不失败,向裁判扔一个高尔夫球。没什么,只有高尔夫球。
在此示例中不是这种情况:
try:
# ...
except ZeroDevisionError:
# ...
那只是一个捕捉高尔夫球的人。他们什么都没扔,只是捉住,只有高尔夫球。篮球,棒球和网球被忽略。那不是抓到所有东西的同一件事,也没有抛出任何东西。
最后:
raise SomeException
可以在任何Python代码中使用。如果有需要,可以允许代码扔球。您不需要同时抓球。
使用异常来脱离正常流程。例如,您只能依靠int()
函数仅返回整数值。当它不能返回值时,由于出了点问题,它将引发异常。这样一来,您就知道它无法返回正确的整数,因为某种原因出错了。 int("Hello world!")
无法返回整数值(该值是什么?),因此引发了ValueError
异常。当您编写自己的代码时,还会遇到无法产生正常有效响应的情况,因此您将自己使用raise
。
用通用except:
捕获所有异常通常不是您想做的。我称之为玩Pokemon,但是在编写良好的Python代码时不应玩Pokemon。因为捕获所有异常意味着您还捕获了KeyboardInterrupt
和MemoryError
,所以通常希望让程序结束的事情。而且您会发现由编程错误引起的简单错误。您只想通常捕获特定的异常。
答案 1 :(得分:0)
except用于try-except语句中,这意味着您的代码中存在错误,导致引发此异常。 Raise用于发信号通知您要指出的异常。一个例子:
for x in range(5):
if x < 3:
raise Exception('x is less than 3')
else:
print('x is 3 or higher')
换句话说,即使您没有发出自己的异常信号,您的代码也不会被破坏/仍将运行,而如果您要从代码中删除try-except语句,则会由于以下原因而引发异常某些错误(ValueError,AssertionError等)。您不能像在发布的代码的第一部分中那样引发系统异常,只有第二部分才能正确处理python本身发出的错误语句。