企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## [捕获所有异常](https://lingcoder.gitee.io/onjava8/#/book/15-Exceptions?id=%e6%8d%95%e8%8e%b7%e6%89%80%e6%9c%89%e5%bc%82%e5%b8%b8) 可以只写一个异常处理程序来捕获所有类型的异常。通过捕获异常类型的基类 Exception,就可以做到这一点(事实上还有其他的基类,但 Exception 是所有编程行为相关的基类): ~~~ catch(Exception e) { System.out.println("Caught an exception"); } ~~~ 这将捕获所有异常,所以最好把它放在处理程序列表的末尾,以防它抢在其他处理程序之前先把异常捕获了。 因为 Exception 是与编程有关的所有异常类的基类,所以它不会含有太多具体的信息,不过可以调用它从其基类 Throwable 继承的方法: ~~~ String getMessage() String getLocalizedMessage() ~~~ 用来获取详细信息,或用本地语言表示的详细信息。 ~~~ String toString() ~~~ 返回对 Throwable 的简单描述,要是有详细信息的话,也会把它包含在内。 ~~~ void printStackTrace() void printStackTrace(PrintStream) void printStackTrace(java.io.PrintWriter) ~~~ 打印 Throwable 和 Throwable 的调用栈轨迹。调用栈显示了“把你带到异常抛出地点”的方法调用序列。其中第一个版本输出到标准错误,后两个版本允许选择要输出的流(在[附录 I/O 流](https://lingcoder.gitee.io/onjava8/#/)中,你将会理解为什么有两种不同的流)。 ~~~ Throwable fillInStackTrace() ~~~ 用于在 Throwable 对象的内部记录栈帧的当前状态。这在程序重新抛出错误或异常(很快就会讲到)时很有用。 此外,也可以使用 Throwable 从其基类 Object(也是所有类的基类)继承的方法。对于异常来说,getClass() 也许是个很好用的方法,它将返回一个表示此对象类型的对象。然后可以使用 getName() 方法查询这个 Class 对象包含包信息的名称,或者使用只产生类名称的 getSimpleName() 方法。 下面的例子演示了如何使用 Exception 类型的方法: ~~~ // exceptions/ExceptionMethods.java // Demonstrating the Exception Methods public class ExceptionMethods { public static void main(String[] args) { try { throw new Exception("My Exception"); } catch(Exception e) { System.out.println("Caught Exception"); System.out.println( "getMessage():" + e.getMessage()); System.out.println("getLocalizedMessage():" + e.getLocalizedMessage()); System.out.println("toString():" + e); System.out.println("printStackTrace():"); e.printStackTrace(System.out); } } } ~~~ 输出为: ~~~ Caught Exception getMessage():My Exception getLocalizedMessage():My Exception toString():java.lang.Exception: My Exception printStackTrace(): java.lang.Exception: My Exception at ExceptionMethods.main(ExceptionMethods.java:7) ~~~ 可以发现每个方法都比前一个提供了更多的信息一一实际上它们每一个都是前一个的超集。