请考虑以下代码:
// 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点某处抛出累积异常。您以前见过这种方法,或者甚至可能实现过这种方法吗?这里的主要目标是,如果您有一个复杂的操作,它使用了许多其他操作,并且“最顶层”操作由于某种原因失败,您可以获得错误的完整诊断:没有一个错误(或许多嵌套错误),但错误的树。
问题是:
答案 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);
如果字符串过于简单,则可以使用更复杂的对象类型轻松执行类似操作。