捕获许多类型的其他异常的异常类

时间:2011-08-13 11:55:04

标签: c++ exception-handling

我试图创建一个异常类(让我们称之为EXP),它将能够捕获各种类型的其他异常类(例如,std :: exception),但没有任何成功。 主要的问题是我需要捕获许多类型的异常,我想知道是否有一种比编写包含所有可能捕获的宏更好的方法。

我想做的事情(如果可能的话)是这样的:

class EXP : ?? maybe must inherit ??
{
    // EXP implementation
}

EXP以这样的方式定义:

try
{
   throw std::exception("error string");
}
catch(const EXP& e)
{
   // catches the exception
}

所以,如果有可能,我如何定义EXP以便它能做我想做的事情?

谢谢! : - )

2 个答案:

答案 0 :(得分:4)

  • 首先,捕获每个异常类型通常是一个糟糕的主意。一般来说,如果你不知道的异常是什么,你怎么能在它发生时有意义地处理?
  • 第二,如果要捕获每种异常类型,可以使用catch (...)。但是,这并不直接使您可以访问捕获的异常对象。要访问异常对象,您必须重新抛出并catch您支持的每种特定类型(此重新抛出和重新调整可以在单独的函数中完成,这可能是您问题的解决方案)。
  • 第三,即使这只捕获C ++异常。其他错误,例如分段错误/访问冲突,将不会被捕获。如果您想捕获这类错误,则需要使用特定于平台的操作或语言扩展。
  • 最后,捕获异常时不会考虑类型转换。如果抛出异常类型E,则只能通过捕获E或其任何基类来处理它。但是,例如,您不能通过捕获可从E构造的异常来处理它。

注意:关于第二点的重新抛出方案,它可能不适用于预标准编译器;例如它不适用于Visual C ++ 6.0。

答案 1 :(得分:1)

最好的方法是从std::exception(或其标准子类型,例如std::runtime_error)派生所有异常类型;然后,您可以使用catch (std::exception const &)来捕获代码,标准库或任何其他行为良好的库所引发的任何内容。