我实现了我的异常
继承自
如下所示:
class MyException : public exception
{
public:
MyException(string exc)
{
this->exc = exc;
}
const char * what() const throw ()
{
return exc.c_str();
}
private:
string exc;
};
现在我抛出
,并假设在我的
,但是我用两种不同的方法对它进行了测试。
部分:
正常捕获
尝试{抛出MyException("This is a exception");} catch (const std::exception exc) { MessageBoxA(NULL,exc.what(),"",MB
_
OK);}
使用引用捕获
尝试{抛出MyException(“这是一个异常”);} catch (const std::exception &exc) { MessageBoxA(NULL,exc.what(),"",MB
_
OK);}
抛出的第一个异常字符串是:
未知异常
和第二个抛出的异常(具有
在catch部分中)是:
这是一个例外
为什么我不能得到我的自定义异常
字符串
在没有引用的情况下正常使用catch时(
)为什么?
好的
通过引用?
发布于 2021-03-01 22:25:51
你正在经历
对象切片
..。
接收派生实例时会发生这种情况
价值
作为它的基类--在您的例子中,捕获
按值。您的派生类的成员在转换为基类的过程中被“切掉”。
当您希望以多态方式使用参数时,通过指针或(const)引用接收总是更可取的。用于捕获
你应该总是通过常量引用来捕捉(我真的想不出这样的场景
不会
)。
发布于 2021-03-01 21:36:30
你正在染上一种
通过值,编译器调用
你的数据就会丢失。
或者;
通过引用捕获异常,这不会导致复制。或者
捕捉
直接。
选项2仍然执行复制,这是多余的,所以我选择选项1。
发布于 2021-03-01 21:43:59
这是所有多态性都有的限制,而不仅仅是例外。
通过引用捕获时,将捕获对派生类的现有实例的引用,因此可以调用它们的虚方法。
当您通过值捕获时(您永远不应该这样做,这是原因之一),您会捕获一个
对象本身。因为
不是抽象的,这当然是可行的。但是,现在将为您提供一个新对象,其类型为
..。因此,它从来没有
成员,更重要的是,它没有
覆盖你想要的。取而代之的是,原始的定义
,因为您从未初始化基异常,所以它会打印出来。
..。
https://stackoverflow.com/questions/66423058
复制相似问题