Search code examples
c++exceptionthrow

C++: Throwing exceptions, use 'new' or not?


Is it proper to use throw new FoobarException(Baz argument); or throw FoobarException(Baz argument);?

When catching I always use catch(FoobarException& e) "just in case" but I never could find a solid answer whether I had to use new or not in C++ (Java definitely) or if it was just a preference of the programmer.


Solution

  • Exceptions in C++ should be thrown by value, and caught by reference.

    So this is the proper way:

    try
    {
        throw FoobarException(argument);
    }
    catch( const FoobarException &ex )
    {
        cout << ex.what() << endl;
    }
    

    Don't throw an exception created with new, since who's responsible for deleting it is not well-defined. In addition, performing allocations during error handling can throw another exception, obscuring the original problem.

    You don't have to catch by const reference (non-const will work fine), but I like doing it anyway. You should however always by reference (not by value) to catch the exception polymorphically. If you don't, the exception's type could be sliced.