If the created exception was a subclass as SQLException, it(or it's copy) would eventually be destructed as SQLException. Thus, everything but SQLException would leak. That happened, because as a quick solution at the time, they all were thrown as SQLException. Caught as SQLException&(they could not be caught as an exception of its own class), they would be destructed as SQLException.
As a solution, create will throw right away the correct type of exception. Anyway It's only used to be thrown everywhere. And seemingly there is no sense to keep it returning exception object. Once such need arises, it can be changed