首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在单个catch块中处理工作线程和主线程的异常?

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

Stack Overflow用户
提问于 2015-12-11 19:24:12
回答 2查看 887关注 0票数 0

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

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

代码语言:javascript
复制
static Exception Main_Exception = null;

它由工作线程更新。

代码语言:javascript
复制
catch (Exception ex)
          {
            Main_Exception = ex;
          }

main方法检查Main_Exception仍然为空或已更新。

代码语言:javascript
复制
if (Main_Exception != null)
                        {... }

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

我设计了下面的主要方法。这种方法是正确的,还是我错过了什么?在这种情况下,“抛出Main_Exception”或“抛出”会工作得很好吗?

代码语言:javascript
复制
main()
{
  try{
         if (Main_Exception != null)
            {
              throw  Main_Exception; OR throw;
            }
  }
  catch(Exception ex){
        //INSERT exception-details into error-log
  }
}
EN

回答 2

Stack Overflow用户

发布于 2015-12-11 19:28:37

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

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

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2015-12-11 19:36:17

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

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

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

代码语言:javascript
复制
if (m_AllExceptions.Count > 0 != null)
{
    AggregateException ex = new AggregateException(m_AllExceptions);
    throw ex;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34222433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档