Common Lisp precedes C ++ for a long time and was based on earlier Lispx. Java, of course, was created by people from Lisp who knew this very well. But Java is contaminated with Lisp due to C, so they also added the proven nonsense of the exception specification.
Common Lisp went further and actually allowed the catch to interact with the throwing procedure, including saying that the throw would continue. The stack simply did not unwind until the catch was done. This meant that you could issue warnings, such as out of memory, as well as a crash.
source share