在C#中处理异常时的良好做法

Osc*_*ros 7 c# exception-handling exception

我在The Pragmatic Programmer和其他一些文章(包括来自Joel Spolsky的文章)中读过,你应该只在异常情况下抛出异常.否则,您应该返回错误.

有时它是可能的(例如,返回-1,-0或者positive number),但是在其他情况下这是不可能的.我的意思是,如果你正在返回课程,你总是可以返回null,但我认为这个想法是返回一些能够提醒来电者发生的事情.

如果我总是返回null,我认为说:如果此方法返回null,则可能是因为A,B,C,D或E

那么,如何在C#中实现这一目标呢?

编辑:
我发布这个问题后的几个小时,我在这里看到了另一个问题,问题本身就是关于发布的代码是否是一个好的做法.

我看到这是我在这里做的事情的另一种方式.链接在这里:

一般财产缺点?

jam*_*kes 12

什么时候抛出异常的更好的规则是这样的:

当你的方法无法按照它的名字所说的那样做时,抛出异常.

空值可用于表示您已经要求不存在的内容.不应该为任何其他错误条件返回它.

规则"只在异常情况下抛出异常"是无助于IMO的问题,因为它没有给出基准来指示什么是异常和什么不是.这就像说"只吃可食用的食物".


Chr*_*s S 10

通过使用数字,您直接与Microsoft推荐的Exceptions相矛盾.我发现的最好的信息来源是杰弗里里希特通过C#3的CLR.另外,.NET框架指南书是值得为它的例外,材料一读.

引用MSDN:

不要返回错误代码.例外是在框架中报告错误的主要方法.

您可以采用的一个解决方案是out获取结果的参数.然后,您的方法返回的方法与您在框架中遇到的方法bool非常相似TryParse.


Jon*_*eet 8

一个要考虑的例子是int.TryParse.它使用一个out参数作为解析值,一个bool返回值表示成功或失败.在bool可以与如果情况值得它枚举或更复杂的对象来代替.(例如,数据验证可能会以真正保证收集故障的方式失败等)

使用.NET 4的替代方案是Tuple...所以int.TryParse 可能是:

public static Tuple<int, bool> TryParse(string text)
Run Code Online (Sandbox Code Playgroud)

下一种可能性是使对象封装整个结果,包括适当的故障模式.例如,Task<T>如果失败,您可以询问其结果,状态和异常.

所有这一切只有在发生这种情况并不是真正的错误时才适用.它并不表示错误,只是用户输入错误.我真的不喜欢返回错误代码 - 异常在.NET中更为惯用.