Ответ 1
Исключения в С++ должны быть сброшены по значению и пойманы по ссылке.
Итак, это правильный способ:
try
{
throw FoobarException(argument);
}
catch( const FoobarException &ex )
{
cout << ex.what() << endl;
}
Не создавайте исключение, созданное с новым, так как тот, кто ответственен за его удаление, не определен. Кроме того, выполнение распределений при обработке ошибок может вызвать другое исключение, затеняя исходную проблему.
Вам не нужно ловить ссылку const (не-const будет работать нормально), но мне все равно нравится делать это. Однако вы должны всегда ссылаться (не по значению), чтобы ловить исключение полиморфно. Если вы этого не сделаете, тип исключения можно будет нарезать.