The recommended way is to throw by value and catch by reference.
Your example code throws a pointer, which is a bad idea since you would have to manage memory at the catch site.
If you really feel you should throw a pointer, use a smart pointer such as shared_ptr
.
Anyway, Herb Sutter and Alexei Alexandrescu explain that really well in their C++ Coding Standards book which I paraphrased.
See C++ Coding Standards: Throw by Value, Catch by Reference.