在我的项目中,我们有一个基本的例外.用于处理显示错误对话框,日志等.我正在寻找一种方法来处理该异常的所有派生类,我认为这样可行:
try { main_loop(); } catch (const MyExceptionBase* e) { handle_error(e); }
抛出的每个子实例都可以由指向其父级的指针表示.但是,不,当现在抛出异常时,它是一个未处理的异常.
为什么是这样?c ++只将异常作为引用抛出吗?从而使我的捕获块无用?但那么为什么这甚至首先编译?
我能想到的另一种方式是:
try { main_loop(); } catch (const ExceptionA& e) { handle_error(e); } catch (const ExceptionB& e) { handle_error(e); } catch (const ExceptionC& e) { handle_error(e); }
这看起来有点难看.这样做的正确方法是什么?没有基本的异常类?或者它能以我想要的方式解决吗?
Ps:handle_error()
简单地使用基类函数display_message_box()
并干净地关闭程序是什么.
只需混合使用两种方法:使用基类,并使用引用.
try { main_loop(); } catch (const MyExceptionBase& e) { handle_error(e); }
如果扔掉它们,BTW C++可以捕获指针.但这不可取.
您最好的选择是捕获基准参考.但请参考,而不是指针.例
try { main_loop(); } catch (const MyExceptionBase& e) { handle_error(e); }
通过指针捕获异常的问题是它必须由指针抛出.这意味着它将使用new创建.
throw new ExceptionA();
这留下了一个相当大的问题,因为它必须在某些时候被删除或者你有内存泄漏.谁应该负责删除此例外?通常很难做到这一点,这就是大多数人通过引用捕获的原因.
通常在C++中你应该......
按引用捕获,按值抛出