这个问题让我发疯,因为我看不出是什么原因造成的。这种行为是出乎意料的,我只是不明白它是如何发生的。当我使用下面的代码执行插件时,我收到错误消息“badaoom”。正如预期的那样。
public void Execute(IPluginExecutionContext context)
{
throw new Exception("bada boom");
try
{
throw new Exception("bada bing");
...
} catch (Exception) { }
...
}
但是,当我注释掉第一个抛出时,我看不到“bada bing”。相反,我得到“对象未设置为引用”!什么鸭子?! (有意拼写错误。)
public void Execute(IPluginExecutionContext context)
{
//throw new Exception("bada boom");
try
{
throw new Exception("bada bing");
...
} catch (Exception) { }
...
}
这是该问题的图形。
最佳答案
在第一个示例中,异常是在调用者级别处理的,直到找到 catch block 为止。在第二个示例中,异常在与 Execute 方法的 try 关联的强制 catch 或 finally block 中进行处理。
因此,在 catch 或 finally block 内的代码中,您会遇到空引用异常
void Main()
{
try
{
Execute();
}
catch(Exception x)
{
Console.WriteLine("In main: " + x.Message);
}
}
public void Execute()
{
// Goes to the catch block in main
//throw new Exception("bada boom");
try
{
// Goes to the catch block associated with this try
throw new Exception("bada bing");
}
catch(Exception x)
{
// Uncomment this to see the null reference exception in main
// Console.WriteLine("In Execute: " + x.InnerException.Message);
Console.WriteLine("In Execute:" + x.Message);
}
}
嗯,当然,当我说强制时,我想说的是你不能写
try
{
....
}
try 后面没有 catch 或 finally 子句。你可以不用代码编写catch或finally block ,但不能省略两个关键字之一及其 block
关于c# - 对象未设置为引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22982411/