在Python中使用异常还是返回码更好?
你可能听说过微软对在.NET中使用异常的建议:
性能考虑
...
只有在特殊情况下才抛出异常,...
另外,当返回代码足够时,不要抛出异常...
(想了解更多内容,可以查看 http://msdn.microsoft.com/en-us/library/system.exception.aspx。)
作为对比,你会建议在Python代码中也这样做吗?
6 个回答
通常来说,Python 这个语言是为了让代码更易读易懂而设计的。
我在这里也想用这个原则:一般情况下,你会希望一个函数返回一个结果(这跟它的名字是一样的意思!),而不是一个错误代码。
所以,通常来说,抛出一个异常比返回一个错误代码要好。
不过,MSDN 文章中提到的内容同样适用于 Python,而且这并不完全是关于返回错误代码和抛出异常之间的区别。
在很多情况下,你会看到异常处理被用来进行正常的流程控制,以及处理一些预期的情况。在某些环境下,这对性能有很大的影响;在所有环境中,它对程序的可读性和可维护性都有很大的影响。
异常是用来处理特殊情况的,这些情况是超出正常程序流程的;如果你预期某件事情会发生,那么你应该直接处理它,而对于那些你无法预期或处理的情况,再去抛出异常。
当然,这并不是一个固定的做法,而只是一个经验法则;最终的决定总是取决于开发者和具体的情况,不能用一套固定的规则来说明——而这对于异常处理来说尤其如此。
理解异常的最好方法是:“如果你的方法做不到它名字里说的事情,就抛出异常。”我个人认为,这个建议在.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);
在Python编程中,处理错误的正确做法是抛出并处理异常。一本很棒的书《Python简明教程》在第六章的“错误检查策略”中详细讨论了这个话题。
这本书提到了两种不同的处理方式:EAFP(“请求原谅比请求许可更容易”)和LBYL(“三思而后行”)。
所以,针对你的问题:
不,我不建议在Python代码中使用相同的方法。我建议你去看看《Python简明教程》第六章。