t3c*_*b0t 2 .net c# runtime exception c#-6.0
我们知道.NET运行时在抛出异常时不是很有用,因为它只显示通用消息而没有指示任何变量或参数名称.但它能以不同的方式做到吗?
例如,在这种情况下:
class foo
{
public void bar() {}
}
foo f = null;
f.var(); // NullReferenceException
Run Code Online (Sandbox Code Playgroud)
但是,由于C#6,如果我们使用new ?运算符,编译器能够生成不同的代码,因此它能够检查是否f为null;
f?.var();
Run Code Online (Sandbox Code Playgroud)
它不能用类似的null检查来包装调用,比如使用?和获取名称f并创建一个类似的exeption消息
附加信息:对象引用"Foo类型的f"未设置为对象的实例.
是否有可能将它也用于其他的行为类型并在那里放置有意义的信息,或者无论这意味着它是否过于昂贵?
Sri*_*vel 11
不,如果可以的话,他们会做到的.布拉德·亚当斯(Brad Adams)在2004年发表了关于它的博客
发生NullReferenceException是因为像"call [eax + 44]"或"mov edx,[esi + 24]"这样的指令导致了访问冲突.我们没有保留足够的信息来形成特定EIP中特定寄存器为NULL的对应关系以及应用程序中的特定引用为空的事实.特别是因为EIP可能位于共享助手中,如写屏障例程或数组助手.在这些情况下,我们必须执行有限的堆栈遍历才能获得有效的EIP.
改善此错误消息所需的机制非常庞大.在可预见的将来,您将不得不依赖于调试器,或者在FX代码上明确检查并抛出适当的NullArgumentException.
正如您所看到的,可用于提供有意义的错误消息的信息非常少,而且创建机制也需要花费很多精力.不太可能你会在.Net中看到这个功能.
| 归档时间: |
|
| 查看次数: |
173 次 |
| 最近记录: |