为什么此代码会导致未处理的异常
本文关键字:未处理 异常 代码 为什么 | 更新日期: 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中启用捕获此类异常,但不应该启用,因为它们通常是由非托管代码中的错误引起的,并表示应用程序状态已损坏。