java Throwable 和 Exception 的差別

Note that an Error is not an Exception; it’s a Throwable.
So, if you catch ExceptionErrors will still get through:

private void m() {    
    try {
        m(); // recursively calling m() will throw a StackOverflowError
    } catch (Exception e) {
        // this block won't get executed, 
        // because StackOverflowError is not an Exception!

to catch “everything”, change your code to this:

try {
} catch (Throwable e) {
   // this block will execute when anything "bad" happens

Note that there might be little you can do if an Error occurs. Excerpt from javadoc for Error:

An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch. Most such errors are abnormal conditions. The ThreadDeath error, though a “normal” condition, is also a subclass of Error because most applications should not try to catch it.