以下是否有任何行为差异:
if (s == null) // s is a string
{
throw new NullReferenceException();
}
Run Code Online (Sandbox Code Playgroud)
和:
try
{
Console.Writeline(s);
}
catch (NullReferenceException Ex)
{ // logic in here
}
Run Code Online (Sandbox Code Playgroud)
如果s为null,则抛出null对象的异常.第一个示例更具可读性,因为它准确显示了错误发生的位置(异常位就在导致异常的行旁边).
我已经通过各种技能水平的各种编码器在各种博客上看到了这种编码风格,但为什么不通过检查s是否为空来执行主逻辑,从而保存异常不被引发?这种方法有不利之处吗?
谢谢
Jon*_*eet 18
不,Console.WriteLine(null)不会抛出异常.它只会打印出来.现在假设您的意思是:
Console.WriteLine(s.Length);
Run Code Online (Sandbox Code Playgroud)
那么它有意义......你应该使用第一种形式.当您无法使用当前信息提前预测时,应该会出现例外情况.如果你能够轻易解决出错的问题,那么尝试一定会失败的操作是没有意义的.它导致代码更难理解并且表现更差.
因此NullReferenceException,ArgumentNullException除非它们是由于一个令人讨厌的API而有时会抛出你可以处理的异常,但是它们不应该被捕获,但它们本来不应该被抛出.这就是为什么在Code Contracts中,失败的契约的默认行为是抛出一个你无法明确捕获的异常,除了捕获所有东西(通常位于堆栈顶部的某个位置).