C++ 我应该用哪种方式捕捉异常?

C++ 我应该用哪种方式捕捉异常?,c++,C++,我有一个带有自定义异常的模板类: MyClass<T>::MyException; 在这两种情况下,除了识别类型之外,我不会使用捕获的异常。一个对象与另一个对象之间是否存在折衷或性能影响?按值捕获将创建异常对象的副本,无论您是否使用它。所以不要。总是通过引用来捕获。从来没有理由按价值抓 另外,typename关键字there是多余的,因为没有涉及任何模板。在第一种情况下: catch (typename MyClass:MyException) 捕获时将调用复制构造函数。此外,如

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

MyClass<T>::MyException;

在这两种情况下,除了识别类型之外,我不会使用捕获的异常。一个对象与另一个对象之间是否存在折衷或性能影响?

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

另外,
typename
关键字there是多余的,因为没有涉及任何模板。

在第一种情况下:

catch (typename MyClass:MyException)
捕获时将调用复制构造函数。此外,如果您从
MyException
派生出另一个异常,它将被切片

当您这样做时:

catch (typename MyClass:MyException &)

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

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

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


关键是:按价值抓也买不到任何东西。在源代码中保存一个字符并不重要:)相反,它会在将来产生一个可能的错误源。

什么是
MyException
,为什么要使用
typename
?另外,单一的
也不正确。从std::exception派生您的异常,并通过“const std::exception&”或通过“const your_exception&”捕获,如果您可以做一些有用的事情(指示设计缺陷)
catch (typename MyClass:MyException)
catch (typename MyClass:MyException &)