为什么此代码导致未处理的异常?

时间:2013-08-22 21:12:01

标签: c# asp.net iis

以下代码似乎应该吞下try块中的任何类型的异常,但IIS工作进程会因为未处理的异常(标记为注释)而定期死亡并重新启动。

try
{
    while (true)
    {
        DispatcherTask task = null;

        lock (sync)
        {
            task = this.getTask();

            if (task == null)
            {
                Monitor.Wait(sync);
                continue;
            }
        }

        lock (task)
        {
            task.Result = task.Task.DynamicInvoke(task.Params);
            // ^ Delegate.DynamicInvoke(object[]) throws a TargetInvocationException

            Monitor.PulseAll(task);
        }
    }
}
catch (Exception e)
{
}

更新

DispatcherTask的定义:

private class DispatcherTask
{
    public Delegate Task;

    public object[] Params;

    public object Result;
}

2 个答案:

答案 0 :(得分:2)

你不能抓住另一个线程的例外,至少不是这样。在新打开的帖子中捕获你的异常,你会没事的。

答案 1 :(得分:0)

在.NET 4及更高版本中,AccessViolationException默认会绕过catch块。可以在web.config中启用捕获此类异常,但不应该这样,因为它们通常是由非托管代码中的错误引起的,并且表明应用程序状态已损坏。