raise 和 except 和有什么不一样?

pas*_*any -1 python

当我们必须处理异常时,引发异常有什么意义?是因为引发异常允许您创建自己定义的异常吗?

except:
  raise ZeroDivisionError
Run Code Online (Sandbox Code Playgroud)

对比

except ZeroDivisionError:
  #code
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 11

如果您将异常视为抛球和接球,这可能会有所帮助。一个人扔球,另一个人接球。只是有的人只想接棒球,而有的人只想接篮球,如果有人扔高尔夫球,也许周围没有人接住......

在这个类比中,看看这三个语法片段:

  • raise SomeException: 抛出异常(一种特定类型的球,比如只扔网球)。
  • except:捕获所有异常(无论类型如何)。这相当于有人接住所有类型的球,无论如何。如果你能把台球扔给他们,他们就会接住。
  • except SomeException:另一方面,只捕获特定类型的异常(例如只捕获棒球而忽略其他任何异常的人)。

然后,下面的代码

try:
    # ...
except:
    raise ZeroDivisionError
Run Code Online (Sandbox Code Playgroud)

两件事,分开的事情。首先,它捕获所有异常。当它捕获到异常时,它会引发一个新的异常

就好像有人站在运动场上,接住篮球、棒球、网球、台球,以及你扔给它的任何东西,但每次他们接住球时,他们都会毫不犹豫地向裁判扔一个高尔夫球。没有别的,只有高尔夫球。

在这个例子中不是这种情况:

try:
    # ...
except ZeroDevisionError:
    # ...
Run Code Online (Sandbox Code Playgroud)

这是唯一有人追赶golfballs。他们没有扔任何东西,他们只是接球,而且只有高尔夫球。篮球、棒球和网球被忽略。这与接住所有东西不同,并且不会进行投掷。

最后:

raise SomeException
Run Code Online (Sandbox Code Playgroud)

可以在任何 Python 代码中使用。如果他们觉得有必要,允许代码扔球。你不需要同时接球。

异常用于打破正常流程。例如,您可以指望该int()函数只返回一个整数值。当它不能返回一个值时,因为有问题,它会引发一个异常。这样你就知道它不能返回一个正确的整数,因为不知何故出了问题。int("Hello world!")不能返回整数值(该值是什么?)所以ValueError引发了异常。当您编写自己的代码时,您还会遇到无法产生正常、有效响应的情况,因此这就是您自己使用的时候raise

和捕获所有异常,用一条毯子except:,是通常不是你想做的事。我称之为玩 Pokemon,但是在编写好的 Python 代码时不应该玩 Pokemon。因为捕获所有异常意味着您还捕获KeyboardInterruptMemoryError,您通常希望让程序结束的事情。并且您会发现由编程错误引起的简单错误。您只想捕获特定的异常,通常是.


And*_*rew 5

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')
Run Code Online (Sandbox Code Playgroud)

换句话说,即使您没有发出自己的异常信号,您的代码也不会被破坏/仍然会运行,而如果您要从代码中删除 try- except 语句,则会因某些错误而引发异常(值错误、断言错误等)。您不能像在发布的代码的第一部分中那样引发系统异常,只有第二部分才能正确处理 python 本身发出的错误语句。