【发布时间】:2012-02-16 07:02:30
【问题描述】:
我最近被告知我正在滥用异常来控制我的应用程序中的流程,所以我试图以某种方式澄清这种情况。
在我看来,一个方法应该抛出一个异常,当它遇到一个无法在内部处理或者可能由调用方更好地处理的情况。
那么 - 是否存在任何特定的规则集,这些规则可用于在开发应用程序时回答以下一组问题:
什么时候应该抛出异常,什么时候应该编写带有strong nothrow 保证的代码,这可能简单地返回
bool以指示成功或失败?当方法抛出异常时,我应该尽量减少情况的数量,或者相反,在处理这些情况时是否应该最大化以提供灵活性?
我应该坚持我在开发应用程序时使用的框架/运行时设置的异常抛出约定,还是应该包装所有这些调用,以便它们匹配我自己的异常抛出策略?
还建议我使用 错误代码 进行错误处理,这看起来非常有效,但从句法的角度来看很难看(此外,当使用它们时,开发人员失去了指定方法的输出)。您对此有何看法?
示例第三个问题(我使用的是I/O框架,遇到以下情况):
所描述的框架不使用异常来处理错误,但是 其他代码确实使用它们。我应该包装每一个可能的失败吗 用
'???'表示并在这种情况下抛出异常? 或者我应该将我的方法的签名更改为bool PrepareTheResultingOutputPath,并且只表明该操作是否是 成功与否?
public void PrepareTheResultingOutputFile(
String templateFilePath, String outputFilePath)
{
if (!File.Exists(templateFilePath))
// ???
if (!Directory.MakePath(outputFilePath))
// ???
if (File.Exists(outputFilePath))
if (!File.Remove(outputFilePath))
// ???
if (!File.Copy(templateFilePath, outputFilePath)
// ???
}
另一个示例 - 即使.NET Framework 也没有遵循一些严格的异常抛出策略。一些方法被记录为抛出 10 多种不同的异常类型,包括像 NullArgumentException 这样的普通异常类型,但其中一些只是简单地返回 bool 以指示操作成功或失败。
谢谢!
【问题讨论】:
-
给自己一个有趣的限制是编写没有 getter/return 值的代码。只是告诉对象做某事。不要期望出现错误代码。如果您通常会根据错误代码采取行动,请将该行为放在对象上,而不是返回错误代码。例如,可能传入一个错误处理程序,以便该类可以做正确的事情。只有这样,如果您的班级无法履行其职责,您才应该抛出异常。
-
错误代码可能会被意外忽略。在支持异常的语言中,错误代码是不合时宜的。
-
标签: exception language-agnostic exception-handling