异常是如何在这个任务之外出现的?

本文关键字:外出 任务 异常 | 更新日期: 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委托。