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

本文关键字:未处理 异常 代码 为什么 | 更新日期: 2023-09-27 18:28:51

下面的代码似乎应该吞下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;
}

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

您不能捕获另一个线程的异常,至少不能以这种方式捕获。在新打开的线程中捕获您的异常,您就可以了。

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