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