3

我在 Python 中有一个类函数,它要么返回成功,要么返回失败,但在失败的情况下,我希望它返回一个特定的错误字符串。我有3种方法:

  1. 将变量 error_msg 传递给最初设置为 None 的函数,如果出现错误,它会被设置为错误字符串。例如:

    if !(foo(self, input, error_msg)):
        print "no error"
    else:
        print error_msg
    
  2. 从函数返回一个包含 bool 和 error_msg 的元组。

  3. 如果发生错误,我会引发异常并在调用代码中捕获它。但由于我没有看到我正在处理的代码库中经常使用异常,所以不太确定采用这种方法。

这样做的 Pythonic 方式是什么?

4

2 回答 2

11

创建您自己的异常并引发它:

class MyValidationError(Exception):
    pass

def my_function():
    if not foo():
        raise MyValidationError("Error message")
    return 4

然后,您可以将您的函数称为:

try:
    result = my_function()
except MyValidationError as exception:
    # handle exception here and get error message
    print exception.message

这种风格称为 EAFP(“请求宽恕比请求许可更容易”),这意味着您可以照常编写代码,在出现问题时引发异常并稍后处理:

这种常见的 Python 编码风格假设存在有效的键或属性,如果假设被证明是错误的,则捕获异常。这种干净快速的风格的特点是存在许多 try 和 except 语句。该技术与许多其他语言(如 C)常见的 LBYL 风格形成鲜明对比。

于 2013-05-08T22:51:04.523 回答
6

引发错误:

if foo(self, input, error_msg):
    raise SomethingError("You broke it")

并处理它:

try:
    something()
except SomethingError as e:
    print str(e)

这是 Pythonic 的方法,也是最易读的。

返回一个类似的元组(12, None)似乎是一个很好的解决方案,但是如果您不一致,就很难跟踪每个方法返回的内容。返回两种不同的数据类型更糟糕,因为它可能会破坏假定为常量数据类型的代码。

于 2013-05-08T22:51:19.303 回答