catched异常如何为null(不是NullReferenceException)?

时间:2009-12-03 17:22:10

标签: c# .net multithreading exception exception-handling

我遇到了一个相当奇怪的小问题。

在以下代码中,我无法理解e可以null;

的方式
try
{
    //Some Code here
}
catch (Exception e)
{
    //Here e is null
}

据我所知,throw null将转换为throw new NullReferenceException()

问题似乎与多线程有关,因为删除另一个线程似乎也解决了这个问题。或者至少我在上面的代码在新线程中运行时才看到这个。整个程序使用很多线程,有点复杂。

无论如何,我的问题是,e怎么可能为空? - 希望答案可以帮助找到问题的根源。

修改 我发现它,因为它在catch语句中引起了NullReferenceException,并且使用调试器我看到了同样的事情。

编辑2 第二天打开VisualStudio再次尝试,没有代码更改,现在相同的catch短语被“调用”,但这次e不是null。看起来这是一个VS故障。

4 个答案:

答案 0 :(得分:7)

你如何确定e实际上是空的?我已经尝试了一些示例并通过CLI规范读取异常,但它似乎不允许异常值为null。此外,如果它为null,则它将没有类型,因此无法满足类型异常的过滤条件。

您是否使用调试器来验证此值?如果是这样,请尝试将其切换为内联断言。

答案 1 :(得分:2)

你是肯定你是不是在Exception e line?

try
{
    //Some Code here
}
catch (Exception e)
{
    int i = 0; // breakpoint here
}

我只是问这个,因为我从来没有见过这种行为,我知道如果你断点异常e,e似乎是空的。在下一行,它变为非空。

答案 2 :(得分:1)

抛出的异常可能不符合CLS标准,而使用过滤器的Try / Catch确实无法捕获该异常。

你应该只能通过try {} catch {}捕获符合CLS标准,没有例外“参数”

答案 3 :(得分:0)

我也有同样的情况。它恰好是Eclipse调试器的一个bug。 Eclipse重启就足够了 - 运行时异常变得正常,而不是空。