【问题标题】:ServiceRuntimeException was unhandled by user code用户代码未处理 ServiceRuntimeException
【发布时间】:2013-09-12 07:18:06
【问题描述】:

我得到以下代码中的ServiceRuntimeException is unhandled by user code,其中ServiceRuntimeException是自定义异常,如何解决?

List<Action> a=new List<Action>();
            try
            {
            foreach (var parallelActivity in parallelActivities)
            {
                a.Add(delegate
                          {
                              try
                              {
                                  parallelActivity.Execute();
                              }catch(ServiceRuntimeException e)
                              {
                                  throw e;//<--Exception thrown at this line
                              }
                          });
            }

                Parallel.Invoke(a.ToArray());
            }
            catch (ServiceRuntimeException e)
            {
                throw e;
            }catch(AggregateException e)
            {
                throw e.InnerExceptions[0];
            }

ServiceRuntimeException的定义

public sealed class ServiceRuntimeException : Exception
    {
        public ServiceRuntimeException(string msg)
            : base(msg)
        {
        }
    }

【问题讨论】:

  • 捕获后不要再通过变量名抛出异常。您将丢失堆栈跟踪!如果你抓住了一些东西并想重新扔它,请使用 throw;没有变量。或者一开始就不要抓住它。
  • @nvoigt,感谢使用 throw 的建议,学习新事物。但这并不能解决这里的问题......

标签: c# c#-4.0


【解决方案1】:

如何解决?

在用户代码中处理它。你的异常被抛出。你需要在某个地方抓住它。如果你不这样做,它将在未处理的异常处理程序中结束,默认情况下它将终止你的程序。

【讨论】:

  • 我在某个地方发现了它,但是当在 Parallel.Invoke(...) 中抛出异常时,它似乎忽略了 Parallel.Invoke 之外的那些捕获
  • 你的“处理”它再次抛出它。确保你在某个地方抓住它并永远处理它。 Parallel.Invoke 中的异常确实会被捕获为单个聚合异常。
【解决方案2】:

而不是重新抛出异常throw e;,我建议您记录异常并将其写入屏幕,以便您可以跟踪它并查看它发生的原因。

如果你想“处理”它,只是不要在 catch 处抛出异常

【讨论】:

    猜你喜欢
    • 2013-12-28
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多