Вы запутались, потому что в каждом из ваших классов исключений есть два базовых класса типа std::exception
. Попробуйте поймать const std::exception&
и посмотрите, как компилятор жалуется.
Фактическая проблема, с которой вы столкнулись, заключается в том, что код явно инициализирует одну из этих баз, но по умолчанию инициализирует другую; предложение catch получает объект FooException
, инициализированный по умолчанию std::exception
, так что это сообщение, которое вы получаете.
Как намекают некоторые комментарии, это сложная иерархия классов, и вы не можете многое сделать, чтобы решить проблему. Чтобы не иметь нескольких копий std::exception
, вам нужно было бы наследовать практически из std::exception
в двух местах, где он используется. Наследование в FooException
легко изменить, но вы не можете изменить тот факт, что std::runtime_exception
фактически не получено из std::exception
.
Итак, есть проблема дизайна, и вы должны решить, что именно вы хотите предоставить пользователю. Эта иерархия делает больше, чем вы описываете в своем вопросе, поскольку она обеспечивает и FooException
, и части стандартной иерархии исключений. Выберите один: либо используйте стандартную иерархию исключений, либо используйте собственную иерархию исключений, при этом FooException
является производным от std::exception
и предоставляет конструктор, который инициализирует подобъект std::exception
.
if( IsPostBack )
{
// get the target of the post-back, will be the name of the control
// that issued the post-back
string eTarget = Request.Params["__EVENTTARGET"].ToString();
}
UniqueID кнопки будет в Запросе. Форма [" __ EVENTTARGET"]
Проверьте значение параметра запроса __ EVENTTARGET, чтобы видеть, является ли это идентификатор рассматриваемой кнопки ссылки.