<EDIT 11/20/2009:
我刚刚读到:。
放弃例外的履约成本是巨大的。 虽然有条理的例外处理是处理错误条件的建议方式,但确保只有在出现错误情况时,才可使用例外情况。 不使用常规控制流动的例外情况。
当然,这只针对网络,还特别针对那些发展高性能应用(如我一样)的人,因此显然不是普遍真理。 然而,我们有很多。 该网络开发商们出那里,因此我认为值得注意。
www.un.org/Depts/DGACM/index_spanish.htm
首先,请简单一点: 我无意就业绩问题与任何人进行斗争。 事实上,事实上,我倾向于同意那些认为过早优化是一种罪.祸首的人。 然而,请允许我谈两点:
海报要求以传统智慧为根据提出客观理由,即应当少地利用例外。 我们可以讨论可读性和适当设计我们所希望的一切;但这些都是主观问题,人们愿意在任何一方争辩。 我认为该海报知道这一点。 事实是,利用例外情况来控制方案流动常常是做事的低效方法。 页: 1 因此,它提出合理建议,很少使用例外情况,就像它提供吃红肉或喝酒的好建议一样。
毫无理由地优化和撰写高效守则之间存在差异。 由此得出的结果是,撰写有力、如果不是优化的话,与简单无效率的东西之间存在差异。 有时,我想当有人对诸如例外处理之类的事情进行争辩时,他们确实只是相互谈论,因为他们正在讨论根本不同的问题。
为了说明我的观点,考虑了以下C#代码实例。
Example 1: Detecting invalid user input
这是我称之为例外的例子:abuse。
int value = -1;
string input = GetInput();
bool inputChecksOut = false;
while (!inputChecksOut) {
try {
value = int.Parse(input);
inputChecksOut = true;
} catch (FormatException) {
input = GetInput();
}
}
对我来说,这部法典是荒谬的。 当然,它work。 没有人对此提出异议。 但should 例如:
int value = -1;
string input = GetInput();
while (!int.TryParse(input, out value)) {
input = GetInput();
}
Example 2: Checking for the existence of a file
我认为,这一设想实际上非常普遍。 它肯定是见/em>,对许多人来说,更多的是“可接受的”,因为它涉及I/O:
string text = null;
string path = GetInput();
bool inputChecksOut = false;
while (!inputChecksOut) {
try {
using (FileStream fs = new FileStream(path, FileMode.Open)) {
using (StreamReader sr = new StreamReader(fs)) {
text = sr.ReadToEnd();
}
}
inputChecksOut = true;
} catch (FileNotFoundException) {
path = GetInput();
}
}
这似乎有足够的道理? 我们再次试图开立档案;如果它没有的话,我们就抓住了这一例外,并试图开立不同的档案。 这有什么错误?
确实没有。 但认为这一替代方案doesn t。 放弃任何例外:
string text = null;
string path = GetInput();
while (!File.Exists(path)) path = GetInput();
using (FileStream fs = new FileStream(path, FileMode.Open)) {
using (StreamReader sr = new StreamReader(fs)) {
text = sr.ReadToEnd();
}
}
当然,如果这两个办法的实际表现是一样的,这确实是一个理论问题。 因此,请看一下。 第一个守则实例是,我提出了10 000个随机扼杀清单,其中没有一个是适当的分类,然后添加了有效的分类。 采用上述两种办法,是我的结果:
Using try
/catch
block: 25.455 seconds
Using int.TryParse
: 1.637 milliseconds
第二种情况是,我基本上采取了同样的做法:提出了10 000个随机扼杀清单,其中没有一个是一条有效的途径,然后又增加了一条有效的道路。 结果是:
Using try
/catch
block: 29.989 seconds
Using File.Exists
: 22.820 milliseconds
许多人会对此做出回应,说“Yeah,好,扔下10 000个例外情况,是极其不现实的;这夸大了结果”。 当然,这是这样做的。 对用户来说,将一个例外处理与处理不正确投入之间的差别并不明显。 事实仍然是,在这两种情况下,使用例外情形比同样可读的其他办法,从1 000到10 000倍以上”。
因此,我列举了以下<代码>GetNine(方法>的例子。 ∗∗∗∗ 速度缓慢或<>可接受>的速度缓慢;其速度比should<>>>>> ...... 免费<>
同样,这只是两个例子。 在<>系列>中,使用例外情形的表现有时不是这种严重的情况(Pavel s权利;毕竟,它取决于执行情况)。 所有我说的话都是:在像上述情况一样的情况下,让我们面对事实、ys, throw弃和捕获一种例外,类似于;它只是一种低效的做事方式,很容易做更好的。
你们要求说明这样的理由,即如果这是每个人在没有知情的情况下跳上波段的情况之一。 但事实上,答案是显而易见的,我认为你已经知道。 <>外观处理具有可喜的业绩。
“K”可能因为你特别的商业情况而被罚款,但 相对而言,<>> ......> 放弃/扣押一项例外规定,在很多情况下,其管理费用会超过必要。 你们知道,我知道:大部分时间<>,如果你在控制方案流动方面再次使用例外规定,你只读写缓慢的代码。
你们也许会问:这一法典为什么不正确?
private int GetNine() {
for (int i = 0; i < 10; i++) {
if (i == 9) return i;
}
}
我很幸运的是,如果你介绍这一职能,你就会发现它非常迅速地执行你典型的业务申请。 这并没有改变这样的事实,即它为完成能够做得更好的东西,提供了极其低效的方法。
这是人们在谈论例外时所说的意思。