【问题标题】:How to use "raise" keyword in Python [duplicate]如何在 Python 中使用“raise”关键字 [重复]
【发布时间】:2012-12-07 03:02:16
【问题描述】:

我已经阅读了“raise”的官方定义,但我仍然不太明白它的作用。

简单来说,什么是“加薪”?

示例用法会有所帮助。

【问题讨论】:

  • 在其他一些语言中称为throw
  • 我想对这个问题有一个相关的补充:raise 是否会自动退出该功能,还是在raise 之后需要return

标签: python keyword raise


【解决方案1】:

它有两个用途。

yentup has given the first one.

它用于引发你自己的错误。

if something:
    raise Exception('My error!')

第二个是在异常处理程序中重新引发当前异常,以便可以在调用堆栈中进一步处理它。

try:
  generate_exception()
except SomeException as e:
  if not can_handle(e):
    raise
  handle_exception(e)

【讨论】:

  • 我输入并得到“未定义全局名称'错误'”。对于 Python 新手来说,您需要“引发异常('我的错误!')”。您将“错误”替换为您的异常名称。您可以使用的标准例外列表如下:docs.python.org/2/library/exceptions.html
  • 请注意,在 python 3.x 中,新语法是 except SomeException as e:
  • @user1735003,as e 有什么作用?和except SomeException有什么区别?
  • @alpha_989:它可以让您获取实际的异常实例。
【解决方案2】:

用于引发错误。

if something:
    raise Exception('My error!')

一些例子here

【讨论】:

    【解决方案3】:

    raise 不带任何参数是 python 语法的一种特殊用法。这意味着获取异常并重新引发它。如果这种用法可以称为 reraise

        raise
    

    来自The Python Language Reference

    如果不存在表达式,raise 重新引发最后一个异常 在当前范围内处于活动状态。

    如果raise 单独使用而没有任何参数,则严格用于reraise-ing。如果在未重新引发另一个异常的情况下完成,则会显示以下错误: RuntimeError: No active exception to reraise

    【讨论】:

      【解决方案4】:

      除了raise Exception("message")raise,Python 3 还引入了一个新的形式,raise Exception("message") from e。它被称为异常链接,它允许您保留原始异常(根本原因)及其回溯。

      它与 C# 中的内部异常非常相似。

      更多信息: https://www.python.org/dev/peps/pep-3134/

      【讨论】:

      • 当我采用这种方法时,建议在发生错误的底层打印跟踪,还是在捕获携带错误的最高层打印?
      【解决方案5】:

      您可以使用它来引发错误作为错误检查的一部分:

      if (a < b):
          raise ValueError()
      

      或者处理一些错误,然后将它们作为错误处理的一部分传递:

      try:
          f = open('file.txt', 'r')
      except IOError:
          # do some processing here
          # and then pass the error on
          raise
      

      【讨论】:

        【解决方案6】:

        raise 导致引发异常。其他一些语言使用动词“投掷”。

        它旨在指示错误情况;它标志着这种情况对于正常流程来说是异常的。

        使用tryexcept 组合的代码“上游”(周围的块或堆栈上较早的函数)可以再次捕获引发的异常来处理它。

        【讨论】:

        • 在重新引发并将异常捕获到顶层期间。我应该在发生错误的底部调用或最高调用时打印trace?还是建议做raise Exception("message") from e把错误带到顶层?
        • @alper:不知道你在问什么。如果您在 except ...: 处理程序中捕获异常,则回溯将包括整个堆栈,从您的 Python 程序启动点到引发异常的位置。因此,实际上,您的处理程序位于堆栈中的哪个位置并不重要。如果处理后需要重新引发异常,请使用raisenothing else
        • @alper: raise Exception("message") from e 用一个新异常替换了e 异常,但只是一个普通的Exception 实例没有任何意义。如果 eTypeErrorValueErrorLibrarySpecificException 您现在无法再捕获这些特定异常,因为您将其替换为 Exception
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-16
        • 1970-01-01
        • 1970-01-01
        • 2014-04-20
        • 1970-01-01
        • 1970-01-01
        • 2010-12-18
        相关资源
        最近更新 更多