Рассмотрим этот код:
try {
const Asdf &a = map1.at(index1);
const Bsdf &b = map2.at(index2);
} catch(std::out_of_range&) {
return false;
}
// <code>
std::cout<<a[b[42]]; // May throw std::out_of_range which should not be caught here.
return true;
<code>
использует a и b. У меня есть два варианта:
- Поместите
<code>
в блок try - Возьмите указатели в блоке try, затем разыщите их.
Первый вариант неверен, потому что если <code>
throws std::out_of_range
функция вернет false, это должно произойти только в случае сбоя поиска карты.
Второй вариант может быть немного уродливым:
const Asdf *a;
const Bsdf *b;
try {
a = &map1.at(index1); // What?
b = &map2.at(index2);
} catch(std::out_of_range&) {
return false;
}
std::cout << (*a)[(*b)[42]];
return true;
Есть ли лучший способ? Что-то вроде try-except-else в Python было бы неплохо, но этого не существует в С++.