C++ catch (std :: exception & e) против catch (...)

Я знаю разницу в обработке обоих этих уловов, но что нужно, чтобы эллипс уловил то, что не улавливает std :: exception?

Например:

try
{
    throw std::runtime("runtime error!");
}
catch(const std::exception& e)
{
    std::cout << "Exception: " << e;
}
catch(...)
{
    std::cout << "How did I get here?";
    throw;
}

Я видел примеры кода, в котором они используются вместе, но я не видел причин, по которым вы могли бы использовать и то, и другое.

Что делать, если код внутри try не генерирует исключение на основе std::exception?

Some programmer dude 17.04.2018 14:20

Если вы пришли из Java или C#, обратите внимание, что в C++ вы можете использовать практически любой тип или объект. Вам не нужно использовать класс, унаследованный от std::exception

Yksisarvinen 17.04.2018 14:25
throw 42; например ...
nvoigt 17.04.2018 14:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
3
5 812
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Хотя это определенно хорошая идея, вы не можете использовать имеют для получения пользовательских исключений из std::exception. C++ позволяет создавать объекты практически любого типа.

Так, например, throw 1; не будет обрабатываться вашим первым обработчиком. И не будет ...

class MyCustomException { // Doesn't derive
 ///
};

... если его бросили.

Как написано, оператор throw генерирует объект, тип которого является производным от std::exception, поэтому он перехватывается первым предложением catch. Если вы измените бросок на throw 3;, исключение будет перехвачено вторым предложением catch, а не первым.

Ответ принят как подходящий
catch(const std::exception& e)

Будет ловить только стандартные исключения.

catch(...)

Там потом все поймают.

Вы можете обрабатывать целые числа и другие типы (http://www.cplusplus.com/doc/tutorial/exceptions/)

Например:

catch(int e)

У меня был этот вопрос, я нашел ответ и не смог найти такой вопрос на SO.

felix1415 17.04.2018 14:26
Самостоятельные ответы действительно приветствуются. Если бы это было вашим намерением с самого начала, в будущем было бы лучше писать вопросы и ответы вместе. Внизу страницы «задать вопрос» есть флажок, открывающий панель ответов.
StoryTeller - Unslander Monica 17.04.2018 14:27

Щелк, я знал, что есть способ дать ответ, мое плохое.

felix1415 17.04.2018 14:28

Вы, наверное, имели в виду:

throw std::runtime_error("runtime error!"); // not std::runtime

std :: runtime_error является производным от std :: exception, поэтому ваш первый блок catch запускается, когда он улавливает исключения типа std::exception. И вы, наверное, имели в виду:

std::cout << "Exception: " << e.what(); // not e

Если вы бросили что-нибудь еще, кроме std::run_time или std::exception и их производных, сработает второй блок catch. Полезное чтение из FAQ по C++: Что мне бросить?

Другие вопросы по теме