简化异常处理的Throwables
Guava提供了一个异常处理工具类, 可以简单地捕获和重新抛出多个异常。这个工具就是Throwables。借助Throwables工具类,我们可以很轻松地完成以下一些事情:
- 获取异常链
- 获取最底层的异常
- 过滤异常,只抛出我们感兴趣的异常
- 把受检查的异常转换为运行时异常
下面直接给出上述几种用例场景的示例代码分析。
获取异常链(getCausalChain)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @Test public void testThrowablesGetCausalChain() { try { try { try { throw new RuntimeException("Inner Most exception"); } catch (Exception e) { throw new SQLException("Middle tier exception", e); } } catch (Exception e) { throw new IllegalStateException("Last exception", e); } } catch (Exception e) { System.out.println(Throwables.getCausalChain(e)); } }
|
上述代码会打印出三个try语句的抛出异常集合。
获取最底层的异常(getRootCause)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @Test public void testThrowablesGetRootCause() { try { try { try { throw new RuntimeException("Inner Most exception"); } catch (Exception e) { throw new SQLException("Middle tier exception", e); } } catch (Exception e) { throw new IllegalStateException("Last exception", e); } } catch (Exception e) { System.out.println(Throwables.getRootCause(e).getMessage()); } }
|
这段代码会打印出Inner Most exception
,因为它是嵌套在最里面的异常,是所有异常抛出的最根本的原因。
过滤异常(propagrateIfInstanceOf)
1 2 3 4 5 6 7 8 9
| @Test public void testPropagrateIfInstanceOf() throws IOException { try { throw new IOException(); } catch (Throwable t) { Throwables.propagateIfInstanceOf(t, NullPointerException.class); System.out.println("Hello World!"); } }
|
这段代码会直接打印Hello World!
,因为抛出的异常是IOException
,而我们感兴趣的是空指针异常NullPointerException
。
把受检查的异常转换为运行时异常(propagate)
1 2 3 4 5 6 7 8 9 10
| @Test public void testThrowablesPropagate() { try { throw new Exception(); } catch (Throwable t) { String messages = Throwables.getStackTraceAsString(t); System.out.println("messages: " + messages); Throwables.propagate(t); } }
|
这个方法将以这个普通的类转化为了运行时异常。
总结
以上就是关于Guava的几种常见的用法,当然了,关于Guava的使用也需要仔细斟酌,如果使用了Guava的这个Throwables工具类之后,导致整体的代码变得很复杂难以理解,那么博主劝你赶紧放弃使用这个工具类,因为对于服务器而言,安全和稳定优先!