满屏的try-catch,不瘆得慌?( 三 )
在初次异常处理的时候会执行上述的代码找到最匹配的那个异常处理器方法 , 后续都是直接从缓存中(一个Map结构 , key是异常类型 , value是异常处理器方法) 。
别着急 , 上面代码最精华的地方就是对matches进行排序的代码了 , 我们来看看ExceptionDepthComparator这个比较器的关键代码 , 如下:
//递归调用 , 获取深度 , depth值越小越精准匹配private int getDepth(Class> declaredException, Class> exceptionToMatch, int depth) {//如果匹配了 , 返回if (exceptionToMatch.equals(declaredException)) {// Found it!return depth;}// 递归结束的条件 , 最大限度了if (exceptionToMatch == Throwable.class) {return Integer.MAX_VALUE;}//继续匹配父类return getDepth(declaredException, exceptionToMatch.getSuperclass(), depth + 1); }
精髓全在这里了 , 一个递归搞定 , 计算深度 , depth初始值为0 。 值越小 , 匹配度越高越精准 。