如何在单个catch块中处理来自工作线程和主线程的异常

本文关键字:线程 工作 异常 处理 单个 catch | 更新日期: 2023-09-27 18:26:34

我有15个工作线程同时运行。代码在SSIS包中运行,我必须保持主线程运行,直到所有工作线程成功完成或因错误而终止。

为了从工作线程捕获异常,我有一个静态异常

static Exception Main_Exception = null;

其由工作线程更新。

catch (Exception ex)
          {
            Main_Exception = ex;
          }

主方法检查main_Exception仍然为null或已更新。

if (Main_Exception != null)
                        {... }

对于出现的任何异常,我需要将异常详细信息插入错误日志中。我想管理main方法的catch块中的所有异常。

我设计了下面的主要方法。这种方法正确吗?还是我遗漏了什么?在这种情况下,"throw Main_Exception"或"throw"是否可以正常工作?

main()
{
  try{
         if (Main_Exception != null)
            {
              throw  Main_Exception; OR throw;
            }
  }
  catch(Exception ex){
        //INSERT exception-details into error-log
  }
}

如何在单个catch块中处理来自工作线程和主线程的异常

您无法管理在主应用程序的后台工作线程上引发的异常。

您将不得不在线程本身中处理它们。

如果你想把所有的日志记录都放在一个地方,那么你就必须这样做:

  1. 处理线程中的异常,收集需要记录的信息并保存
  2. 在监视线程(即对线程事件作出反应)的代码中,读取此错误状态并抛出一个带有必要信息的新异常

这将被处理并记录在您的全局异常处理程序中。

第一个想法似乎是将每个异常记录在自己的线程中。

无论如何,如果您需要跟踪多个异常,可以考虑使用AggregateException类。

您可以保留一个List<Exception> m_AllExceptions(或者更好的SynchronizedCollection<Exception>,因为您将从多个线程访问它),而不是您的变量MainThreadException然后当在主线程中检查异常时,你可以使用这样的东西:

if (m_AllExceptions.Count > 0 != null)
{
    AggregateException ex = new AggregateException(m_AllExceptions);
    throw ex;
}