在Python中使用异常还是返回码更好?

50 投票
6 回答
16756 浏览
提问于 2025-04-15 13:01

你可能听说过微软对在.NET中使用异常的建议:

性能考虑

...

只有在特殊情况下才抛出异常,...

另外,当返回代码足够时,不要抛出异常...

(想了解更多内容,可以查看 http://msdn.microsoft.com/en-us/library/system.exception.aspx。)

作为对比,你会建议在Python代码中也这样做吗?

6 个回答

10

通常来说,Python 这个语言是为了让代码更易读易懂而设计的。
我在这里也想用这个原则:一般情况下,你会希望一个函数返回一个结果(这跟它的名字是一样的意思!),而不是一个错误代码。
所以,通常来说,抛出一个异常比返回一个错误代码要好。

不过,MSDN 文章中提到的内容同样适用于 Python,而且这并不完全是关于返回错误代码和抛出异常之间的区别。
在很多情况下,你会看到异常处理被用来进行正常的流程控制,以及处理一些预期的情况。在某些环境下,这对性能有很大的影响;在所有环境中,它对程序的可读性和可维护性都有很大的影响。

异常是用来处理特殊情况的,这些情况是超出正常程序流程的;如果你预期某件事情会发生,那么你应该直接处理它,而对于那些你无法预期或处理的情况,再去抛出异常。

当然,这并不是一个固定的做法,而只是一个经验法则;最终的决定总是取决于开发者和具体的情况,不能用一套固定的规则来说明——而这对于异常处理来说尤其如此。

16

理解异常的最好方法是:“如果你的方法做不到它名字里说的事情,就抛出异常。”我个人认为,这个建议在.NET和Python中都适用。

关键的区别在于,有些方法经常做不到它们名字里说的事情,比如把字符串解析成整数,或者从数据库中获取记录。在C#中,通常会尽量避免抛出异常:

int i;
if (Int32.TryParse(myString, out i)) {
    doWhatever(i);
}
else {
    doWhatever(0);
}

而Python在这方面就比较宽松:

try:
    i = int(myString)
except ValueError:
    i = 0
doWhatever(i);
42

在Python编程中,处理错误的正确做法是抛出并处理异常。一本很棒的书《Python简明教程》在第六章的“错误检查策略”中详细讨论了这个话题。

这本书提到了两种不同的处理方式:EAFP(“请求原谅比请求许可更容易”)和LBYL(“三思而后行”)。

所以,针对你的问题:

不,我不建议在Python代码中使用相同的方法。我建议你去看看《Python简明教程》第六章

撰写回答