实现并行异常以获得错误树
本文关键字:错误 并行 异常 实现 | 更新日期: 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的某处抛出累积异常。您以前见过这种方法吗,或者甚至可能实现过类似的方法吗?这里的主要目标是,如果您有一个复杂的操作,它使用了许多其他操作,并且"最顶层"操作由于某种原因失败了,那么您可以获得错误的完整诊断:不是单个错误(或多个嵌套错误),而是错误的树。
问题是:
- 你觉得怎么样?
- 你以前看过吗?
- 你试过实现类似的东西吗?
也许使用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);
如果字符串太简单,很容易用更复杂的对象类型做类似的事情。