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 &)