当自定义异常遇到反射

遇到问题

  1. 自定义异常:LogicExcetion
  2. 在方法调用的最外层method.invoke()处catch(LoginException e)
  3. 方法抛LogicExcetion未被捕获,控制台输出InvocationTargetException

分析原因

如图:
当自定义异常遇到反射_第1张图片
反射方法只返回以上几种异常,其中InvocationTargetException的描述:如果底层方法抛出一个异常,则会封账在该异常中进行抛出

解决问题

InvocationTargetException异常中的变量target即为底层方法抛出的异常,所以可以这样修改,贴源码:

try {
            Object res = method.invoke(handler, params);
            if (res instanceof Message) {
                Message message = (Message) res;
                session.sendPacket(message);
            }
        } catch (SecurityException | IllegalAccessException | IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            Throwable cause = e.getCause();
            if (cause instanceof LogicException) {
                LogicException le = (LogicException) cause;
                switch (le.getType()) {
                    case CLIENT_EXCEPTION:
                        session.sendPacket(new ResLogicError(le.getMsg()));
                        break;
                    case LOGIC_EXCEPTION:
                        logger.error("代码逻辑错误:{}", le.getMsg());
                        break;
                    default:
                        break;
                }
            }
        }

最后

个人简单理解,不对之处还望指正!

你可能感兴趣的:(java后端)