Единственная ловушка, которую я вижу, это то, что вы делаете что-то нелегко, когда вам не нужно. : -)
Обычно вы используете shared_pointer для управления временем жизни объекта, в противном случае это не очевидно. Здесь ясно, что ваша не является обязанностью управлять созданными исключениями. Компилятор должен сделать это за вас!
Когда обработано исключение, среда выполнения уничтожит shared_pointer, который затем уничтожит объект исключения. В противном случае среда выполнения уничтожила бы объект исключения напрямую! Что вы получаете?