加和除之间有什么区别?

时间:2019-07-08 20:39:52

标签: python

当我们不得不处理异常时,引发异常有什么意义呢?是因为引发异常使您可以创建自己定义的异常吗?

except:
  raise ZeroDivisionError

vs。

except ZeroDivisionError:
  #code

2 个答案:

答案 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。因为捕获所有异常意味着您还捕获了KeyboardInterruptMemoryError,所以通常希望让程序结束的事情。而且您会发现由编程错误引起的简单错误。您只想通常捕获特定的异常。

答案 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本身发出的错误语句。