由于cacheBuilder是另起线程获取,对call方法中的抛出的异常进行了封装。所以我们在最外层捕获时是无法直接指定异常类型捕获的,
获取异常的原因判断实例类型
public static void main(String[] args) { Cache<String, Boolean> cahceBuilder = CacheBuilder.newBuilder().expireAfterWrite(5, TimeUnit.SECONDS).build(); String key="123"; try{ cahceBuilder.get(key, new Callable<Boolean>() { @Override public Boolean call() throws Exception { //执行业务方法 bizMethon(); return true; } }); }catch(Exception e){ //获取导致抛出此异常的原因,判断是否为指定异常实例 Throwable cause = e.getCause(); if(cause instanceof NullPointerException){ logger.error(String.format("捕获到指定异常:%s", e.getMessage()),e); }else{ logger.error(String.format("其他异常:%s", e.getMessage()),e); } } } //模拟业务方法,直接抛出异常 public static void bizMethon() throws NullPointerException{ throw new NullPointerException("测试异常"); }