In general, it is considered good practice to throw by value (rather than by pointer), but catch by (const) reference.
try {
// throw new std::runtime_error("Error!"); // Don't do this!
// This creates an exception object
// on the heap and would require you to catch the
...