异常是如何在这个任务之外出现的?
本文关键字:外出 任务 异常 | 更新日期: 2023-09-27 18:11:49
我认为这种方法是安全的,因为它不允许异常传播。我的一位同事建议,异常可能需要在主线程上观察到,因此应该传递给主线程。这就是答案吗?您可以看到异常是如何通过这一点泄漏的吗?
private static void InvokeProcessHandlers<T>(List<T> processHandlers, Action<T> action)
{
// Loop through process handlers asynchronously, giving them each their own chance to do their thing.
Task.Factory.StartNew(() =>
{
foreach (T handler in processHandlers)
{
try
{
action.Invoke(handler);
}
catch (Exception ex)
{
try
{
EventLog.WriteEntry(ResourceCommon.LogSource,
String.Format(CultureInfo.CurrentCulture, "An error occurred in a pre- or post-process interception handler: {0}", ex.ToString()),
EventLogEntryType.Error);
}
catch (Exception)
{
// Eat it. Nothing else we can do. Something is seriously broken.
}
continue; // Don't let one handler failure stop the rest from processing.
}
}
});
}
顺便说一下,堆栈跟踪确实显示了一个异常从这个方法泄漏。
异常是AccessViolation,我认为它与调用这个方法的代码有关:
InvokeProcessHandlers<IInterceptionPostProcessHandler>(InterceptionPostProcessHandlers, handler => handler.Process(methodCallMessage, methodReturnMessage));
InterceptionPostProcessHandlers的getter包含这个:
_interceptionPreprocessHandlers = ReflectionUtility.GetObjectsForAnInterface<IInterceptionPreprocessHandler>(Assembly.GetExecutingAssembly());
请确保在迭代
之前检查参数是否为空引用。除了之外,没有什么问题,因为写日志不会阻止执行,但我建议通过将日志封装到一个方法中,使其更干净,更易于维护,如:
bool Logger.TryLog(params);
,在这个方法里面,用一个返回false的catch做try,如果你想在客户端代码中处理它,如果你不介意,就用一种干净的封装方式调用记录器
我的一位同事建议,可能需要对异常进行处理在主线程上观察到的,因此应该传递给主线程线程。
如何"传递到主线程"?主线程正在做自己的事情。
你能做的最好的是使它可配置,并接受一个被调用的ExceptionHandler委托。