由于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("测试异常");
    }

 

posted on 2017-06-22 17:19  菜鸟你够了  阅读(474)  评论(0编辑  收藏  举报