2

我有 4 行和两个 throw 语句;

Pseudocode ;
In function f () 
     if a == 2 
           throw SMT_0 
     if b == 3  
           throw SMT_1 

对于 a != 2 和 b != 3,我想同时抛出两个 throw 语句。我能怎么做 ?

 ex : 
     if a!= 2 && b != 3 
            throw SMT_0 and SMT_1
4

3 回答 3

2

你不能。但是您可以抛出任何对象,因此您可以使用 OO 技术让您抛出的一个对象包含来自SMT_0和的相关信息SMT_1

抛出的值是什么,你的catch块是什么样的?

更新

好的,所以看起来你想抛出你的输入不正确的原因。

问:为什么?必须报告所有原因有那么重要吗?也许您可以简单地报告其中一个原因,让用户修复并迭代?(如果信息的预期接收者不是用户而是程序员,我认为完全没有理由必须立即报告所有错误)。

现在,如果您确实必须抛出报告所有错误,那么您可以简单地抛出一个数组enum CLASSNAME.REASONS而不是一个值。

于 2011-03-10T14:43:17.000 回答
1

闻起来就像您正试图控制异常的程序流……这不是一个好主意。

但是既然你问了,为什么你没有第三种选择 throw SMT_01 ?

于 2011-03-10T14:44:11.177 回答
1

您不妨考虑使用boost exceptions。这将为您提供一种将标记引入异常层次结构的方法。也就是说,您可能有一个包含许多信息的异常。

例如(我做的事情),如果你有一个解析器,你得到的任何语法错误都有多个要传播的东西。首先,您将使用您遇到的确切错误创建异常,例如语法错误。在堆栈上更高的函数中,您可以捕获此异常添加行和文件信息。

在创建时,您还可以同时添加许多信息花絮。假设您派生了一个名为my_error. 您还可以定义所需的标签,以便您的示例如下所示:

 if( a != 2 && b != 3 )
        throw my_error() << SMT_0 << SMT_1
 if( a == 2 )
       throw my_error() << SMT_0 
 if( b == 3  )
       throw my_error() << SMT_1 

If you have an enum, as you indicate in a comment, you might want to a tag that simply takes that enum as a param, though you may only use each tag once in the exception.

于 2011-03-10T15:01:12.220 回答