Jos*_*Fox 18 c++ exception-handling
C++之间的区别是什么?
try { /*some code here*/}
catch(MyException& ex)
{ throw ex;} //not just throw
Run Code Online (Sandbox Code Playgroud)
和
try { /*some code here*/}
catch(MyException& ex)
{ throw;} //not throw ex
Run Code Online (Sandbox Code Playgroud)
它只是在堆栈跟踪中(在C++中,在任何情况下都不是C#或Java中的标准)?
(如果它有任何区别,我使用MSVS 2008.)
Nav*_*een 32
throw;
在throw ex;
抛出新异常时重新捕获它捕获的同一异常对象.除了创建新异常对象的性能原因之外,它没有什么区别.如果你有一个异常层次结构,其中有一些其他的异常类派生自MyException
类,并且抛出异常你已经完成了throw DerivedClassException;
它可以被它捕获catch(MyException&)
.现在,如果您修改此捕获的异常对象并使用throw;
异常对象的类型重新抛出它仍将是DerivedClassException
.如果您执行throw Ex;
了对象切片,则新抛出的异常将是类型MyException
.
eph*_*ent 14
[ C++ FAQLite§17.9 ]
throw;
(throw
关键字后面没有异常对象)是什么意思?我会在哪里使用它?您可能会看到如下所示的代码:
Run Code Online (Sandbox Code Playgroud)class MyException { public: ... void addInfo(const std::string& info); ... }; void f() { try { ... } catch (MyException& e) { e.addInfo("f() failed"); throw; } }
在此示例中,语句
throw;
表示"重新抛出当前异常".这里,函数捕获异常(通过非const引用),修改异常(通过向其添加信息),然后重新抛出异常.通过在程序的重要函数中添加适当的catch子句,可以使用此习惯用法实现一种简单形式的堆栈跟踪.另一个重新抛出的成语是"异常调度员":
Run Code Online (Sandbox Code Playgroud)void handleException() { try { throw; } catch (MyException& e) { ...code to handle MyException... } catch (YourException& e) { ...code to handle YourException... } } void f() { try { ...something that might throw... } catch (...) { handleException(); } }
这个习惯用法允许
handleException()
重复使用单个函数()来处理许多其他函数中的异常.[ C++ FAQLite§17.11 ]当我抛出这个对象时,它会被复制多少次?
要看.可能是"零".
抛出的对象必须具有可公开访问的复制构造函数.允许编译器生成任意次数复制抛出对象的代码,包括零.但是,即使编译器从未实际复制抛出的对象,它也必须确保异常类的复制构造函数存在且可访问.
(为了更清楚地说明我认为很明显......)
catch(MyException& ex) { throw ex; }
可以复制ex
,包括它带来的所有问题; catch(MyException& ex) { throw; }
不得.
Man*_*agu 13
如果您有异常层次结构,则throw ex
可以对异常进行切片,而throw
不会.例如:
#include <iostream>
#include <string>
using namespace std;
struct base
{
virtual string who() {return "base";}
};
struct derived : public base
{
string who() {return "derived";}
};
int main() {
try {
try {
throw derived(); // throws a 'derived'
}
catch (base& ex)
{
throw ex; // slices 'derived' object to be a 'base' object
}
}
catch (base& ex)
{
cout<<ex.who()<<endl; // prints 'base'
}
}
Run Code Online (Sandbox Code Playgroud)
更改throw ex
只是throw
,你会得到的输出derived
,这就是你可能有望得到.
归档时间: |
|
查看次数: |
5658 次 |
最近记录: |