【问题标题】:re-raise exception in Python在 Python 中重新引发异常
【发布时间】:2021-10-04 05:01:02
【问题描述】:

在 Robert Smallshire 和 Austin Bingham 写的非常棒的书中,有以下代码:

def convert(s):
    """Convert a string to an integer."""
    try:
        return int(s)
    except (ValueError, TypeError) as e:
        print("Conversion error: {}".format(str(e)), file=sys.stderr)
        raise

之后,作者又包含了如下的string_log函数

def string_log(s):
    v = convert(s)
    return log(v)

string_log('ouch') 的输出如下

我无法理解 raise 语句的确切作用?

另外,作者说在ValueErrorTypeError的情况下,第一个函数输出负错误代码-1的代码,即第一个函数如下

import sys

def convert(s):
    """Convert a string to an integer."""
    try:
        return int(s)
    except (ValueError, TypeError) as e:
        print("Conversion error: {}".format(str(e)), file=sys.stderr)
        return -1

如果我们运行以下命令(没有进行任何更改 string_log())是 string_log('cat')

是非pythonic,但为什么呢?

【问题讨论】:

  • 请修正你的缩进。
  • 本书的书名(“The Python Apprentice”?)会比您的评论有用得多。
  • 您是在问没有参数的 raise 做什么,还是在问为什么引发异常优于返回特殊值?
  • 这能回答你的问题吗? raise with no argument

标签: python exception raise


【解决方案1】:

如果convert 在错误中返回-1,那么您必须明确检查该错误以避免string_log 也返回-1。就像string_log 期望convert 返回一个有效字符串一样,调用者也可能如此。让-1 传播可能会在很长一段时间内未被检测到,并且一旦发生错误确实,就不清楚错误的根源是什么。

有一个异常,string_log 如果没有捕获到异常就不会返回;异常继续调用堆栈,直到它被捕获,或者解释器退出并回溯。该回溯将准确地显示异常的来源。


raise 不带参数只会引发最近的异常,而无需编写类似

except (ValueError, TypeError) as e:
    print("Conversion error: {}".format(str(e)), file=sys.stderr)
    raise e

在这里,无论如何,你在调用print 时使用e,但如果你没有,你可以写

except (ValueError, TypeError):
    print("Something bad happened!")
    raise

无需将异常绑定到显式名称。

【讨论】:

    猜你喜欢
    • 2016-03-18
    • 2011-09-12
    • 2023-03-31
    • 1970-01-01
    • 2012-01-13
    • 2014-06-25
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    相关资源
    最近更新 更多