262просмотров
8 мая 2025 г.
Score: 288
#база
Какой из обработчиков catch сработает в таком коде?
#include <iostream> class BaseException : public std::exception {};
class DerivedException : public BaseException {}; int main(int argc, char* argv<::>)
{ try { throw DerivedException(); } catch (const std::exception&) { std::cout << "std::exception" << std::endl; } catch (const BaseException&) { std::cout << "BaseException" << std::endl; } catch (const DerivedException&) { std::cout << "DerivedException" << std::endl; } return 0;
}
Не смотря на то, что блок с DerivedException выглядит наиболее подходящим, выберется первый блок catch, который сможет обработать исключение, то есть std::exception, потому что он является родителем DerivedException.
Это значит, что наиболее специализированные исключения нужно располагать первыми, то есть порядок в коде должен быть обратным.