luc*_*luc 39 python performance exception
您可能知道Microsoft关于在.NET中使用异常的建议:
性能注意事项
...
仅在特殊情况下抛出例外,......
另外,当返回代码足够时,不要抛出异常......
(请参阅http://msdn.microsoft.com/en-us/library/system.exception.aspx上的全文.)
作为比较,你会推荐相同的Python代码吗?
jam*_*kes 10
理解异常的最好方法是" 如果你的方法无法按照它的名字所做的那样做,就扔掉." 我个人认为,这个建议应该同样适用于.NET和Python.
关键的区别在于,您拥有的方法经常无法完成其名称应该执行的操作,例如,将字符串解析为整数或从数据库中检索记录.C#样式是为了避免首先抛出异常:
int i;
if (Int32.TryParse(myString, out i)) {
doWhatever(i);
}
else {
doWhatever(0);
}
Run Code Online (Sandbox Code Playgroud)
而Python对这种事情更加放心:
try:
i = int(myString)
except ValueError:
i = 0
doWhatever(i);
Run Code Online (Sandbox Code Playgroud)
在Python中,异常并不像在其他语言中那样昂贵,因此我不建议尝试避免异常.但是如果你确实抛出异常,你通常会想要在代码中的某处捕获它,例外情况是发生致命错误.
通常,Python面向表达性.
我会在这里应用相同的原则:通常,您希望函数返回 结果(与其名称一致!)而不是错误代码.
出于这个原因,通常比返回错误代码更好地引发异常.
但是,MSDN文章中所述的内容也适用于Python,并且它并没有真正连接到返回错误代码而不是异常.
在许多情况下,您可以看到用于正常流量控制和处理预期情况的异常处理.在某些环境中,这会对性能产生巨大影响; 在所有环境中,它对程序表达能力和可维护性都有很大影响.
例外是针对特殊情况,超出正常计划流程; 如果你期望会发生某些事情,那么你应该直接处理,然后提出任何你不能期望/处理的东西.
当然,这不是一个配方,而只是一个启发式; 最终的决定总是取决于开发人员和上下文,并且无法在一套固定的指南中说明 - 这对于异常处理来说更为真实.
我认为是返回错误代码还是抛出异常是非常值得考虑的事情,跨语言比较可能会有所帮助并提供信息。我想对这个问题的非常笼统的答案只是考虑:任何函数的合法返回值集应该尽可能小,并在必要时尽可能大。
通常,这意味着如果给定的方法在单个测试用例中返回一个整数,用户可以理所当然地期望该方法总是返回一个整数或抛出异常。但是,当然,概念上最简单的方法并不总是处理事情的最佳方法。
最小惊喜的回报值通常是None
; 如果你仔细研究它,你会发现它是该None
许可证的语义:它是一个单一的、不可变的值,在很多情况下,评估False
或禁止进一步的计算——没有串联,没有算术。所以,如果你选择了写一个frob(x)
方法,它返回一个数字的字符串输入,以及None
用于非数字字符串和任何其他的输入,并使用像在表达式中a=42+frob('foo')
,你仍然在那里假的事情变得异常非常接近点发生了。当然,如果您填充frob('foo')
到尚未定义的数据库列中NOT NULL
,您可能会在几个月后遇到问题。这可能是也可能不是合理的。
因此,在大多数情况下,例如,您想从字符串中派生出一个数字,使用像一个空的那样的东西,float(x)
或者int(x)
是要走的路,因为当没有给出可消化的输入时,这些内置函数将引发异常。如果这不适合您的用例,请考虑None
从自定义方法返回;基本上,这个返回值告诉消费者“对不起,我无法理解您的输入。”。但是,只有在您确定从那时起在您的程序中进行的操作确实有意义时,您才想要这样做。
你看,我刚刚发现了如何在 PHP 中将每个通知、警告和错误消息变成一个潜在的显示停止异常。在标准的 PHP 配置中,变量名中的拼写错误只会让我发疯,这只是给用户的一个通知。这太糟糕了。该程序只是继续使用根本没有意义的程序代码来做事!我不敢相信人们会发现这是一个功能。
同样,人们应该这样看待它:如果在任何给定的时间点,可以以合理的成本断言一段代码的执行不再有意义——因为值丢失、超出范围或是一种意外类型,或者当数据库连接等资源出现故障时——必须尽量减少调试麻烦,中断执行和手动控制到代码中任何级别的感觉有权处理事故的级别。
经验表明,避免及早采取行动并允许虚假值潜入您的数据中无济于事,只会使您的代码更难调试。许多过度类型转换的例子也是如此:允许将整数添加到浮点数是合理的。允许将只有数字的字符串添加到数字是一种虚假的做法,它可能会产生奇怪的、未本地化的错误,这些错误可能会出现在恰好正在处理该数据的任何给定行上。
归档时间: |
|
查看次数: |
9928 次 |
最近记录: |