当前位置:  开发笔记 > 编程语言 > 正文

捕获c ++基础异常

如何解决《捕获c++基础异常》经验,为你挑选了2个好方法。

在我的项目中,我们有一个基本的例外.用于处理显示错误对话框,日志等.我正在寻找一种方法来处理该异常的所有派生类,我认为这样可行:

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()并干净地关闭程序是什么.



1> jpalecek..:

只需混合使用两种方法:使用基类,并使用引用.

try
{
  main_loop();
}
catch (const MyExceptionBase& e)
{
  handle_error(e);
}

如果扔掉它们,BTW C++可以捕获指针.但这不可取.



2> JaredPar..:

您最好的选择是捕获基准参考.但请参考,而不是指针.例

try
{
  main_loop();
}
catch (const MyExceptionBase& e)
{
  handle_error(e);
}

通过指针捕获异常的问题是它必须由指针抛出.这意味着它将使用new创建.

throw new ExceptionA();

这留下了一个相当大的问题,因为它必须在某些时候被删除或者你有内存泄漏.谁应该负责删除此例外?通常很难做到这一点,这就是大多数人通过引用捕获的原因.

通常在C++中你应该......

按引用捕获,按值抛出

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有