C++ catch(std::exception & e) 与 catch(...)
C++ catch(std::exception & e ) vs. 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;
}
我看过结合使用这两种方法的代码示例,但我没有看到您同时使用这两种方法的原因。
虽然这样做绝对是个好主意,但您 没有 从 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)
你的意思可能是:
throw std::runtime_error("runtime error!"); // not std::runtime
std::runtime_error is derived from the std::exception 所以你的第一个 catch 块被触发,因为它捕获类型 std::exception
的异常。你的意思可能是:
std::cout << "Exception: " << e.what(); // not e
如果您抛出了 std::run_time
或 std::exception
及其派生词以外的任何其他内容,则会触发第二个 catch
块。 C++ FAQ 的有用阅读:
What should I throw?
我知道处理这两种捕获的不同之处,但是椭圆需要什么才能捕获 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;
}
我看过结合使用这两种方法的代码示例,但我没有看到您同时使用这两种方法的原因。
虽然这样做绝对是个好主意,但您 没有 从 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)
你的意思可能是:
throw std::runtime_error("runtime error!"); // not std::runtime
std::runtime_error is derived from the std::exception 所以你的第一个 catch 块被触发,因为它捕获类型 std::exception
的异常。你的意思可能是:
std::cout << "Exception: " << e.what(); // not e
如果您抛出了 std::run_time
或 std::exception
及其派生词以外的任何其他内容,则会触发第二个 catch
块。 C++ FAQ 的有用阅读:
What should I throw?