我尝试在我的代码中找到正确的方法来实现异常时进行了一些研究
Throw by value, catch by reference
是C ++中交易异常的推荐方式。关于抛出的异常何时超出范围我感到很困惑。
我有以下异常层次结构
ConnectionEx is mother of all connection exceptions thrown by dataSender
ConnectionLostEx is one of the subclasses of ConnectionEx
所以这是一个示例代码。单词DataSender实例是DataDistrubutor的成员,它调用dataSender上的函数,例如send(),并且DataSender在出现问题时将ConnectionEx的子类作为异常抛出。
// dataSender send() function code chunk
try
{
// some problem occured
// create exception on stack and throw
ConnectionLostEx ex("Connection lost low signals", 102);
throw ex;
}
catch(ConnectionLostEx& e)
{
//release resources and propogate it up
throw ;
}
//A data distributor class that calls dataSender functions
try
{
// connect and send data
dataSender.send();
}
catch(ConnectionEx& ex)
{
// free resources
// Is the exception not out of scope here because it was created on stack of orginal block?
//propogate it further up to shows cause etc..
}
在C#或java中我们有一个类似引用的指针,并且它一直有效,我对异常的范围感到困惑,因为异常是在值超出范围时被值抛出的???并且当作为父类型被捕获时,在这种情况下,可以将其转换为在catch块链中将真实的一个返回到哪里?
答案 0 :(得分:3)
抛出异常的副本,而不是原始对象。没有必要实例化局部变量并抛出它;抛出异常的惯用方法是实例化它并将其抛出到同一行。
throw ConnectionLostEx("Connection lost low signals", 102);