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