code: public static <T> BaseDTO<T> exec(Callable<BaseDTO<T>> callable, String msg, Object... param) {
          try {
              log.info("函数调用");
              BaseDTO<T> dto = callable.call();
              log.info("函数调用结果为：[{}]", dto);
              return dto;
          } catch (Exception e) {
              if (param == null || param.length == 0) {
                  log.error(msg, e);
              } else {
                  Object[] params = new Object[param.length + 1];
                  System.arraycopy(param, 0, params, 0, param.length);
                  params[param.length] = e;
                  log.error(msg, params);
              }
              return BaseDTO.buildError();
          }
      }
docs: 执行函数
  
  @param callable 函数
  @param msg 错误消息模板
  @param param 错误消息模板参数
  @param <T>      返回数据类型
  @return 执行结果