Есть одна исключительная ситуация, но нужно чтобы на нее было 2 разных реакции.
void f1() {
//throw ситуация 1
}
void f2() {
//throw ситуация 1
}
int main() {
try
{
/*
.
.
.
*/
}
catch (...)
{
//реакция на ситуация 1
//в f1()
}
catch (...) {
//реакция на ситуация 1
//в f2()
}
return 0;
}
Класс ошибки должен быть один, но при этом в catch реакции разные. Когда ситуация противоположна этой(возникают 2 разные ситуации, но ловится одном cathc), я понимаю как реализовать. Есть догадка что это делается с помощью полиморфизма, но пока что я не понимаю как.
Есть разные варианты...
Либо обертываем каждый вызов f1() в
try {
f1();
} catch (ThatException&)
{
throw F1Exception();
}
(соответственно, f2() в свой блок), либо пишем функцию-обертку
void f1ex()
{
try {
f1();
} catch (ThatException&)
{
throw F1Exception();
}
}
(опять же - свою для f2()) и вызываем ее. F1Exception можно сделать наследником ThatException - того самого исключения, которое f1 и f2 генерируют. Тогда можно будет не делать отдельные блоки, а проверять, скажем, с помощью dynamic_cast, кто именно сгенерирован. Или сделать одно исключение FException с полем, которое будет указывать, где оно сгенерировано.
Если генерация исключения выполняется именно вашим кодом - делаете исключения разными, или одним с добавлением поля, или разными, но унаследованными от общего. Если f1/f2 вызывают нечто, что может дать одинаковые исключения - то как выше, оборачивайте эти вызовы в блоки try-catch или в функции-обертки.
"По-моему, так." (с) Пух
Если вы не можете добавлять классы исключений, но можете изменить существующие, то можно использовать такой вариант: добавьте в класс исключения поле которое будет хранить информацию о контексте в котором возникло исключение (имя функции например).
Продвижение своими сайтами как стратегия роста и независимости