【问题标题】:Re-throw an exception inside catch block在 catch 块内重新抛出异常
【发布时间】:2014-06-19 17:10:36
【问题描述】:

任何人都可以确认我的信息是否正确:

在 C++ 中,在 catch 块中,我们可以使用 throw 语句重新抛出异常,但抛出的异常应该与当前捕获的异常具有相同的类型。

【问题讨论】:

  • 我当然不希望;或者我的异常处理代码中有很大一部分是错误的! ;)

标签: c++ exception throw


【解决方案1】:

不一定。一旦你抓住它,如何处理它取决于你。您可以抛出相同的异常或全新的异常。或者,什么都不做。

【讨论】:

    【解决方案2】:

    重新抛出的异常可以有不同的类型。 这可以在 VS2012 上正确编译和运行:

    #include <iostream>
    
    int main() try
    {
        try
        {
            throw 20;
        }
        catch (int e)
        {
            std::cout << "An exception occurred. Exception Nr. " << e << std::endl;
            throw std::string("abc");
        }
    }
    catch (std::string const & ex)
    {
        std::cout << "Rethrow different type (string): " << ex << std::endl;
    }
    

    输出:

    An exception occurred. Exception Nr. 20
    Rethrow different type (string): abc
    

    【讨论】:

    • 这个例子证实了我的信息是错误的,我在eclipse cdt上运行它并且它成功了。谢谢。
    • 但是,throw; 总是会重新抛出现有的异常,从而产生一些巧妙的技巧。
    • 等等,为什么20 不在您的示例输出中?
    • 纠正了一些错误。随意询问是否还有更多
    【解决方案3】:

    throw; 本身在一个 catch 块中重新抛出刚刚捕获的异常。如果您需要(例如)执行一些清理操作以响应异常,但仍允许它向上传播到可以更充分地处理它的地方,这很有用:

    catch(...)
    {
       cleanup();
       throw;
    }
    

    但你也完全可以这样做:

    catch(SomeException e)
    {
       cleanup();
       throw SomeOtherException();
    }
    

    事实上,这样做通常很方便,以便将您调用的代码引发的异常转换为您记录的任何类型。

    【讨论】:

      猜你喜欢
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 2012-09-14
      • 1970-01-01
      相关资源
      最近更新 更多