我从标准异常类继承my_exception.
我实现了what()函数,以便它返回一个存储在私有字符串变量中的字符串
我认为最好将异常定义为嵌套类,在ios_base :: failure的iostream库中完成此操作.
我不太确定,是在哪里和如何定义my_excpetion的对象.我希望我可以看到iostream功能的内部代码,看看它们是如何做到的.
我想过几个选择:
>为了异常的每一个原因,我可以定义一个my_exception的静态实例,一个构造函数获取一个字符串并将其保存到我的私有字符串指针.
>为了异常的每个原因,我可以定义一个继承自my_exception的类,并实现什么作为返回一个常量字符串的原因(原因).
我可以持有每个异常子类的一个实例,或者抛出该类型.
BTW,我们什么时候通常抛出类型而不是实例?
>我想这是错误的:每次我想抛出一个异常,创建一个新的my_exception与构造函数获取一个字符串.这是在Java中完成的,但是据了解,在C中将会有问题,因为异常应在某处被删除.对?
我认为第一个是正确的,是吗?
是否有更多的标准选项?
非常感谢你!
解决方法
更长的答案:您列出的所有选项都有效.一般来说,你想要抛出一个对象而不是一个指针的原因是因为在异常被捕获时给予自己和你的客户端的选择.
如果你通过指针捕捉,catch(my_exception * e),那么你不知道从它看是否应该删除内存.
如果您通过值捕获,catch(my_exception e)则可能会有切片的风险,如果异常对象最终成为带有其他派生类的基类.
通过引用捕捉也没有这些问题.如果你写catch(my_exception& r),那么你可以捕获多态对象,你不用担心释放内存.
所以,为了回答你的另一个问题,当你抛出,抛出一个临时对象:throw my_exception().这会创建一个临时对象,这是被抛出的(被引用)捕获的一个临时对象,当它在catch块的末尾超出范围时自动被破坏. (这实际上是通过引用获取价值的另一个好处,因为catch-by-value在捕获时创建了另一个副本.)
对于您的其他派生异常类,它是一种风格选择.从my_exception导出一个不同的what()实现是非常标准的.我不会说你需要将静态对象中的字符串或实例存储起来 – 它们很小,并且构建一个函数与抛出异常抛出堆栈的过程相比,几乎没有时间.