"The exception object is copied to a special location to survive the stack unwinding."
How are exceptions allocated on the stack caught beyond their scope?
And no, it is not a good practice to create the exception in the heap, because then you will have to manage it in the catch block. The standard is to throw by value and catch by reference. Check these for more information: