Можно ли выбрасывать два значения одновременно? - PullRequest
2 голосов
/ 10 марта 2011

У меня есть 4 строки и два оператора броска;

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

Ответы [ 3 ]

2 голосов
/ 10 марта 2011

Вы не можете.Но вы можете бросить любой объект, так что вы можете использовать методы ОО, чтобы один брошенный объект содержал соответствующую информацию как из SMT_0, так и SMT_1.

Что такое выброшенные значения, и что делает вашcatch блок выглядит как?

Обновление :

ОК, так что похоже, что вы хотите выбросить причину (ы), что ваш ввод был неправильным.

Вопрос: почему?Это так важно, чтобы все причин были указаны?Может быть, вы можете просто отправить отчет по одной из причин, позволить пользователю исправить это и повторить?(Если предполагаемый получатель информации - не пользователь, а программист, я не вижу абсолютно никаких причин, по которым все ошибок должны сообщаться одновременно).

Теперь, есливам нужно выдать отчет обо всех ошибках, тогда вы можете просто выбросить массив enum CLASSNAME.REASONS вместо одного значения.

1 голос
/ 10 марта 2011

Вы можете рассмотреть возможность использования буст-исключений . Это даст вам возможность ввести тегирование в иерархию исключений. То есть, у вас может быть одно исключение, которое несет много битов информации.

Например (что-то, что я делаю), если у вас есть синтаксический анализатор, любая синтаксическая ошибка, которую вы получаете, должна распространяться несколькими способами. Прежде всего, вы создадите исключение с точной ошибкой, с которой вы столкнулись, например, с синтаксической ошибкой. В функции выше в стеке вы можете поймать это исключение, добавить строку и информацию о файле.

Во время создания вы также можете свободно добавлять много информации одновременно. Допустим, вы получили исключение повышения, называемое 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 

Если у вас есть enum, как вы указали в комментарии, вы можете захотеть использовать тег, который просто принимает это перечисление в качестве параметра, хотя вы можете использовать каждый тег только один раз в исключении.

1 голос
/ 10 марта 2011

пахнет, как будто вы пытаетесь контролировать выполнение программы с исключениями ... не очень хорошая идея.

но так как вы спрашиваете, почему бы вам просто не сделать третий альтернативный бросок SMT_01?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...