JAVA调用方法统一打印日志和try/catch

需求: 

        避免编写重复的代码,如何把下面的两个需求抽取成公共逻辑;

        1. 调用其他方法时打印被调用方法的路径、入参、以及执行耗时情况;

        2. 调用方法遇到异常时,灵活控制是否要捕获异常或者抛出异常;

 实现思路

  • 使用函数式编程;

1.1. 创建一个接口(用来获取函数真实的调用路径和方法)

package com.xxx.utils.function;

import java.io.Serializable;
import java.lang.invoke.SerializedLambda;
import java.lang.reflect.Method;

/**
 * 
 */
public interface SerializedLambdaFunction extends Serializable {

    /**
     * 这个方法返回的SerializedLambda是重点
     * @return
     * @throws Exception
     */
    default SerializedLambda getSerializedLambda() throws Exception {
        //writeReplace改了好像会报异常
        Method write = this.getClass().getDeclaredMethod("writeReplace");
        write.setAccessible(true);
        return (SerializedLambda) write.invoke(this);
    }

    /**
     * 获取函数真实调用的实现类名
     * @return
     */
    default String getImplClass() {
        try {
            return getSerializedLambda().getImplClass();
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 获取函数真实调用的实现方法名
     * @return
     */
    default String getImplMethodName() {
        try {
            return getSerializedLambda().getImplMethodName();
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 获取函数真实调用的类名#方法名
     * @return
     */
    default String getClassAndMethodName() {
        try {
            return getImplClass() + "#" + getImplMethodName();
        } catch (Exception e) {
            return null;
        }
    }
}

1.2. 创建一个函数接口(继承SerializedLambdaFunction)

        下面是只接收一个参数并且有返回值的函数接口,如果要编写多个参数的函数接口只需要在<>泛型中和apply方法中添加泛型即可;

package com.xxx.utils.function;

/**
 * 接收一个参数并返回结果的函数
 * 函数方法是 {@link #apply(Object)}
 *
 * @param <T> 第一个参数
 * @param <R> 返回结果
 */
@FunctionalInterface
public interface MonoFunction<T, R> extends SerializedLambdaFunction {

    /**
     * 使用指定的参数调用该方法
     *
     * @param t 第一个参数
     * @return 返回结果
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Java 中,可以使用 try-catch 块来捕捉异常,并使用 e.printStackTrace() 方法来快速打印异常信息。例如,以下代码演示了如何使用 try-catch 块和 e.printStackTrace() 方法来捕获和打印异常: ```java try { // 可能会抛出异常的代码块 } catch (Exception e) { // 捕获异常并打印异常信息 e.printStackTrace(); } ``` 通过调用 e.printStackTrace() 方法,将会在控制台上打印出异常信息和异常堆栈跟踪。 ### 回答2: 在Java中,使用try-catch语句块可以处理异常,并提供异常信息打印功能。为了快速打印异常信息,可以使用try-catch代码块的打印异常堆栈跟踪方式。下面是一个示例: ```java try { // 可能抛出异常的代码 } catch (Exception e) { // 打印异常信息 e.printStackTrace(); } ``` 在上面的代码中,首先使用try关键字来包裹可能抛出异常的代码块。如果代码块中出现了异常,程序会立即跳转到catch语句块,并将异常对象赋值给e变量。然后,使用e.printStackTrace()方法将异常信息打印到标准错误流(即控制台)中。 这种方式可以快速打印异常信息,并且包括异常的名、消息和堆栈跟踪等详细信息。堆栈跟踪可以告诉我们异常发生的位置,便于定位和解决问题。 然而,在实际开发中,为了更好地进行异常处理和日志记录,可能需要使用更复杂的日志框架,如Log4j、SLF4J等。这些框架提供了更灵活和可配置的方式来打印异常信息,并且可以将日志保存到文件中。可以根据具体需求选择适合的日志框架来进行异常处理和日志记录。 ### 回答3: 在Java中,我们可以使用try-catch块来捕获和处理异常。try块用于包含可能会抛出异常的代码,而catch块用于捕获并处理这些异常。要在控制台快速打印异常信息,我们可以按照以下步骤进行操作: 1. 在try块中编写可能会抛出异常的代码。 2. 在catch块中编写对异常进行处理的代码,同时使用捕获的异常对象来获取异常信息。 3. 使用异常对象的getMessage()方法来获取异常的详细信息。 4. 在catch块中使用System.out.println()方法将异常信息打印到控制台。 下面是一个例子来演示如何快速打印异常信息: ```java public class Main { public static void main(String[] args) { try { int num = 10 / 0; // 这里会抛出一个ArithmeticException异常 } catch (ArithmeticException e) { System.out.println("发生异常:" + e.getMessage()); } } } ``` 在上面的例子中,我们进行了一个除法操作,除数为0,这会导致一个ArithmeticException异常的抛出。在catch块中,我们使用getMessage()方法获取异常的详细信息,并使用System.out.println()方法将异常信息打印到控制台。 在实际开发中,我们可以根据具体的业务需求进行异常处理,可以选择将异常信息打印到控制台、记录到日志文件或向用户显示错误信息等。可以根据具体的需求来选择最合适的异常处理方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值