【问题标题】:Which way should I catch an exception? [duplicate]我应该以哪种方式捕获异常? [复制]
【发布时间】:2014-04-19 22:02:12
【问题描述】:

我有一个带有自定义异常的模板类:

MyClass<T>::MyException;

使用我的类时,我只关心是否抛出了异常,以便我可以通过编程方式处理它。因此,当我捕捉到异常时,我不会费心去命名它。

try {
   MyClass<T>::MyMethod ();
} catch (typename MyClass<T>::MyException) {
   //Act appropriately
}

我想知道我添加引用运算符时是否有任何区别,例如

} catch (typename MyClass::MyException &) {

在任何一种情况下,除了识别类型之外,我最终都不会使用捕获的异常。两者之间是否存在权衡或性能损失?

【问题讨论】:

  • 什么是MyException,您为什么使用typename?单:也不对。
  • 从 std::exception 导出你的异常并通过 'const std::exception&' 或通过 'const your_exception&' 捕获,如果你能做一些有用的事情(表明设计缺陷)

标签: c++


【解决方案1】:

您应该始终通过引用捕获异常。这只是一个好习惯

但是,在这种特殊情况下,我认为这并不重要。没有切片问题,因为您没有命名捕获的异常对象,因此没有您可以访问的成员。异常是否被复制两次应该无关紧要 - 这只是一个异常情况,并且复制很便宜(如果抛出是您正常程序流程的一部分,那么无论如何您都会遇到更大的问题)。

重点是:按价值捕捉也不会给您带来任何好处。在源代码中保存一个字符不算数 :) 恰恰相反,它可能会在将来造成错误。

【讨论】:

    【解决方案2】:

    第一种情况:

    catch (typename MyClass:MyException)
    

    捕获时您将调用复制构造函数。此外,如果您有另一个源自 MyException 的异常,它将被切片。

    当你这样做时:

    catch (typename MyClass:MyException &)
    

    您不会导致生成副本(因此更高效),并且您可以安全地捕获派生异常。

    【讨论】:

      【解决方案3】:

      无论您是否使用,按值捕获都会创建异常对象的副本。所以不要。总是通过引用来捕捉。永远没有理由按价值捕捉。

      顺便说一句,typename 关键字是多余的,因为没有涉及任何模板。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-14
        • 2021-08-20
        • 2020-08-08
        相关资源
        最近更新 更多