C++ catch blocks - catch exception by value or reference? [duplicate]

强颜欢笑 提交于 2019-12-17 02:19:26

问题


Possible Duplicate:
catch exception by pointer in C++

I always catch exceptions by value. e.g

try{
...
}
catch(CustomException e){
...
}

But I came across some code that instead had catch(CustomException &e) instead. Is this a)fine b)wrong c)a grey area?


回答1:


The standard practice for exceptions in C++ is ...

Throw by value, catch by reference

Catching by value is problematic in the face of inheritance hierarchies. Suppose for your example that there is another type MyException which inherits from CustomException and overrides items like an error code. If a MyException type was thrown your catch block would cause it to be converted to a CustomException instance which would cause the error code to change.




回答2:


Catching by value will slice the exception object if the exception is of a derived type to the type which you catch.

This may or may not matter for the logic in your catch block, but there is little reason not to catch by const reference.

Note that if you throw; without a parameter in a catch block, the original exception is rethrown whether or not you caught a sliced copy or a reference to the exception object.




回答3:


Unless you want to fiddle with the exception, you should usually use a const reference: catch (const CustomException& e) { ... }. The compiler deals with the thrown object's lifetime.




回答4:


in (CustomException e) new object of CustomException is created... so it's constructor will be called while in (CustomException &e) it will just the reference... not new object is created and no constructor will be called... so formal is little bit overhead... later is better to use...



来源:https://stackoverflow.com/questions/2522299/c-catch-blocks-catch-exception-by-value-or-reference

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!