实现并行异常以获得错误树

本文关键字:错误 并行 异常 实现 | 更新日期: 2023-09-27 18:05:02

考虑以下代码:

// 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,为什么?这基本上是主要问题。

在上面的代码中,在y之前检查x或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. 你试过实现类似的东西吗?

实现并行异常以获得错误树

也许使用AggregateException?

您似乎想要强制执行一组业务规则。

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

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

怎么了

    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");
    }

我认为如果不实现称为continuation的东西(能够返回函数的当前状态以延迟执行),这将是非常困难的。

基本上,问题是,而不是一个异常(或者,更确切地说,抛出…事情,因为你并不总是必须抛出一个异常对象在所有语言中)是一个消息,a point which cannot be handled已达到,它将不得不返回这两个和能力强制延续过去的那一点。(因此,您需要continuations)

另外,至少在较低的层次上,这会迫使语言在这些情况下总是抛出一个对象。另一方面,抛出int类型,有时是有用的。

说了这么多,没有什么可以阻止你实现一个类似于你所描述的宏。

// 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 ...;
}

不需要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);

如果字符串太简单,很容易用更复杂的对象类型做类似的事情。