我在Python中有一个类函数,它返回成功或失败,但如果发生故障,我希望它返回一个特定的错误字符串。我有三种方法:
将变量error_msg传递给最初设置为None的函数,如果出现错误,则将其设置为错误字符串。例如:
if !(foo(self, input, error_msg)):
print "no error"
else:
print error_msg
从函数中返回一个包含bool和error_msg的元组。
我在出现错误时引发异常并在调用代码中捕获它。但是由于我没有看到我正在处理的代码库中经常使用异常,所以不太确定采用这种方法。
Pythonic的做法是什么?
答案 0 :(得分:8)
创建自己的异常并改为:
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 编码风格假定存在有效的键或属性 如果假设被证明是假的,则捕获异常。这干净又快 风格的特点是存在许多尝试和除外 声明。该技术与许多人共同的LBYL风格形成鲜明对比 其他语言,如C.
答案 1 :(得分:5)
提出错误:
if foo(self, input, error_msg):
raise SomethingError("You broke it")
处理它:
try:
something()
except SomethingError as e:
print str(e)
这是Pythonic方法,最具可读性。
返回像(12, None)
之类的元组似乎是一个很好的解决方案,但是如果你不一致的话,很难跟踪每个方法返回的内容。返回两种不同的数据类型甚至更糟糕,因为它可能会破坏采用常量数据类型的代码。