You throw by value, and you catch by const reference. No need to delete, you make these Exceptions on the stack, and if you re-throw it will get copied. This way you can catch a derived exception as its base (say std::exception), re throw the std::exception object and catch again as a derived exception. And NEVER EVER touch MFC exceptions.... I have a small hierarchy of exception classes, eventually derived from std::exeption, and their c'tors are filling the error-string with a sensible message, and then add filename and line number of the error to member strings, so I can have a look when debugging.
My opinions may have changed, but not the fact that I am right.