实现并行异常以获取错误树?

时间:2011-08-10 20:02:33

标签: c# java c++ error-handling

请考虑以下代码:

// this method should add numbers, the requirements are:
// x >= 3 and y <= 5
int add(int x, int y)
{
  if(x < 3) throw new ...;
  if(y > 5) throw new ...;
}

这绝对是传统方法,但是如果你为x和y传递了无效值,你只会获得x的异常。为什么x而不是y?只是因为你先检查x然后才检查y。为什么?这基本上是主要问题。

在上面的代码中,在x之前的y或y之前检查x是绝对没有意义的。仅仅因为执行的想法在单个线程中流动,一些语句在其他语句之前执行。

我正在考虑实施一种使用并行异常的机制。这个想法是,如果有两个语句可以同时执行(执行顺序无关紧要),并且它们都抛出异常,我希望能够处理所有这些异常。伪代码如下:

// this method should add numbers, the requirements are:
// x >= 3 and y <= 5
int add(int x, int y)
{
  parallel
  {
    if(x < 3) throw new ...;
    if(y > 5) throw new ...;
  } // point A

  return x + y;
}

在A点某处抛出累积异常。您以前见过这种方法,或者甚至可能实现过这种方法吗?这里的主要目标是,如果您有一个复杂的操作,它使用了许多其他操作,并且“最顶层”操作由于某种原因失败,您可以获得错误的完整诊断:没有一个错误(或许多嵌套错误),但错误的

问题是:

  1. 您怎么看?
  2. 你以前见过吗?
  3. 您是否尝试过类似的实现?

6 个答案:

答案 0 :(得分:3)

也许使用AggregateException

答案 1 :(得分:2)

您似乎想要执行一系列业务规则。

一种方法是创建一组破坏的规则并添加特定的破坏规则(例如输入太短,输入必须是字母数字)作为该集合的单独元素,然后抛出包含破碎集合的BrokenRulesException规则作为参数。

这允许调用者在不改变任何语言语义的情况下完全理解输入的错误。

答案 2 :(得分:1)

错误:

    int add(int x, int y)
    {
      if(x < 3 || y > 5) 
       throw new Error("Incorrect Parameter, x must be >= 3 and y must be <= 5");
    }

答案 3 :(得分:1)

我认为如果没有实现一个名为continuation的东西,这将是非常困难的 - 能够为延迟执行返回函数的当前状态。

基本上,问题在于,而不是异常(或者更确切地说,抛出的东西,因为你并不总是必须在所有语言中抛出一个Exception对象),而是a point which cannot be handled已经消息达到了,无论如何,它必须返回那个和强制继续超过这一点的能力。 (因此,您需要continuations

此外,至少在较低级别,这会强制语言总是在这些情况下抛出一个对象。另一方面,抛出一个int偶尔会有用。

所有这一切都说,没有什么可以阻止你,比如说,实现一个类似你所描述的宏的宏。

答案 4 :(得分:0)

// this method should add numbers, the requirements are:
// x >= 3 and y <= 5
int add(int x, int y)
{
  if(x < 3 && y > 5) throw new ...;
  if(x < 3) throw new ...;
  if(y > 5) throw new ...;
}

答案 5 :(得分:0)

在不需要AggregateExceptions或类似的情况下,这不可能相当容易地完成:

string ErrorMessage="";
if(x<3) ErrorMessage += "x must be >=3\n";
if(y>5) ErrorMessage += "y must be <=5\n";
if(ErrorMessage!="") throw new Exception(ErrorMessage);

如果字符串过于简单,则可以使用更复杂的对象类型轻松执行类似操作。