Ваш оригинальный код был в порядке. Вы перехватили разные типы исключений и вызвали функцию, которая будет регистрировать сообщения и повторно отправлять их. Оператор throw
не обязательно должен отображаться непосредственно внутри соответствующего блока catch
. Если вы вызываете одну из этих функций «заметки» и вы не в настоящее время обрабатываете исключение, то ваша программа будет вызывать terminate()
.
Ваш новый код тоже в порядке. Можно все перехватить, а затем вызвать другую функцию, которая перебрасывается, чтобы перейти к более конкретному обработчику. Это диспетчер исключений , описанный в FAQ C ++ . Выглядит немного странным, чтобы перебросить исключение после , когда блок диспетчеризации завершился, но если тот же оператор throw
произошел после того, как noteError
вернул (внутри исходного блока catch
) вместо того, где сейчас, тогда это было бы совершенно обыденно; это продемонстрировано в стандарте, §15.1 / 6.