实现并行异常以获得错误树
Implementing parallel exceptions to get trees of errors?
考虑以下代码:
// 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 >=3n";
if(y>5) ErrorMessage += "y must be <=5n";
if(ErrorMessage!="") throw new Exception(ErrorMessage);
如果字符串太简单,很容易用更复杂的对象类型做类似的事情。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- 编译器错误(英特尔并行工作室 2019 与 Visual Studio 社区 2019)
- 并行快速排序分区中的隔离错误
- C++ openmp 并行计算计算错误的结果
- 将 for 循环与嵌套的 while 循环并行化时出现 OpenMP 分段错误
- C 并行矩阵乘法,计算错误
- OpenMP并行区域中的std::vector push_back会导致错误共享吗
- Eigen & OpenMP : 由于错误共享和线程开销,没有并行化
- 在与 OpenMP 并行的嵌套 for 循环中写入共享数组(通过指针)如何产生错误的结果
- C++内存中的并行MPI代码错误
- cilk_for 通过 std::set 缺少运算符-() 进行并行化的错误
- pi 计算的 OpenMP 并行化要么慢,要么错误
- 并行程序编译错误
- STL并行累加函数错误
- c++并行编程错误
- 实现并行异常以获得错误树
- 如果在并行部分中执行,则引发错误
- 用OpenMP(Parallel for)并行化时分割错误