Я знаю разницу в обработке обоих этих уловов, но что нужно, чтобы эллипс уловил то, что не улавливает 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;
}
Я видел примеры кода, в котором они используются вместе, но я не видел причин, по которым вы могли бы использовать и то, и другое.
Если вы пришли из Java или C#, обратите внимание, что в C++ вы можете использовать практически любой тип или объект. Вам не нужно использовать класс, унаследованный от std::exception
throw 42; например ...





Хотя это определенно хорошая идея, вы не можете использовать имеют для получения пользовательских исключений из 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.
Щелк, я знал, что есть способ дать ответ, мое плохое.
Вы, наверное, имели в виду:
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++:
Что мне бросить?
Что делать, если код внутри
tryне генерирует исключение на основеstd::exception?