您可能知道Microsoft关于在.NET中使用异常的建议:
性能注意事项
...
仅在特殊情况下抛出例外,......
另外,当返回代码足够时,不要抛出异常......
(请参阅http://msdn.microsoft.com/en-us/library/system.exception.aspx上的全文.)
作为比较,你会推荐相同的Python代码吗?
pythonic要做的是提出和处理异常.优秀的书籍"简而言之的Python"在第6章的"错误检查策略"中对此进行了讨论.
这本书讨论了EAFP("请求宽恕比允许更容易")与LBYL("在你跳跃之前看").
所以回答你的问题:
不,我不建议使用相同的python代码.我建议你简单地阅读Python的第6章.
理解异常的最好方法是" 如果你的方法无法按照它的名字所做的那样做,就扔掉." 我个人认为,这个建议应该同样适用于.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面向表达性.
我会在这里应用相同的原则:通常,您希望函数返回 结果(与其名称一致!)而不是错误代码.
出于这个原因,通常比返回错误代码更好地引发异常.
但是,MSDN文章中所述的内容也适用于Python,并且它并没有真正连接到返回错误代码而不是异常.
在许多情况下,您可以看到用于正常流量控制和处理预期情况的异常处理.在某些环境中,这会对性能产生巨大影响; 在所有环境中,它对程序表达能力和可维护性都有很大影响.
例外是针对特殊情况,超出正常计划流程; 如果你期望会发生某些事情,那么你应该直接处理,然后提出任何你不能期望/处理的东西.
当然,这不是一个配方,而只是一个启发式; 最终的决定总是取决于开发人员和上下文,并且无法在一套固定的指南中说明 - 这对于异常处理来说更为真实.