我认为这种方法是安全的,因为它不允许异常传播。我的一位同事建议可能需要在主线程上观察异常,因此应该将其传递给主线程。这是答案吗?你能看出异常是如何泄漏的吗?
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());
答案 0 :(得分:1)
在迭代
之前,请确保检查空引用的参数除此之外没有任何错误,因为日志写入不是停止执行的东西,但我建议通过将日志记录封装到如下的方法中来使其更加干净和可维护:
bool Logger.TryLog(params);
并且在这个方法里面尝试使用一个返回false的catch,如果你想在客户端代码中处理它,那就去做吧,如果你不介意只是以干净的封装方式调用logger
答案 1 :(得分:1)
我的一位同事建议可能需要例外 在主线程上观察,因此应该传递给主线程 线程。
怎么能“传递到主线程”?主要线程是离开并做自己的事情。
您可以做的最好的事情是使其可配置并接受被调用的ExceptionHandler委托。