pro*_*ach 5 c# exception-handling
我最近有一个编码错误,在某些条件下变量没有被初始化,我得到了一个NullReferenceException.这需要一段时间来调试,因为我必须找到生成此数据的数据位以重新创建错误,因为异常不提供变量名称.
显然我可以在使用之前检查每个变量并抛出一个信息性异常但是有更好的(读取更少编码)方式吗?我的另一个想法是随pdb文件一起发送,以便错误信息包含导致错误的代码行.其他人如何避免/处理这个问题?
谢谢
Jon*_*eet 11
首先:不要在一个声明中做太多.如果你在一行中有大量的解除引用操作,那么找到罪魁祸首将会更加困难.该得墨忒耳定律与此也有帮助-如果你有类似的东西order.SalesClerk.Manager.Address.Street.Length,那么你有很多选择,当你得到一个异常涉水通过.(我不是关于得墨忒耳法则的教条,但是适度的一切......)
其次:倾向于使用as,除非它对于不同类型的对象有效,通常在之后立即进行空检查.所以在这里:
// What if foo is actually a Control, but we expect it to be String?
string text = foo as string;
// Several lines later
int length = text.Length; // Bang!
Run Code Online (Sandbox Code Playgroud)
在这里,我们得到一个NullReferenceException并最终将其追溯到textnull - 但是你不知道那是因为foo是null,还是因为它是一个意外的类型.如果它应该真的,真的是一个string,然后施放:
string text = (string) foo;
Run Code Online (Sandbox Code Playgroud)
现在,您将能够分辨出两种情况之间的区别.
第三:正如其他人所说,验证您的数据 - 通常是公共和潜在内部API的参数.我在Noda Time的足够多的地方这样做,我有一个实用工具类来帮助我整理支票.例如(来自Period):
internal LocalInstant AddTo(LocalInstant localInstant,
CalendarSystem calendar, int scalar)
{
Preconditions.CheckNotNull(calendar, "calendar");
...
}
Run Code Online (Sandbox Code Playgroud)
你应该记录什么可以和不可以为null.