gpt4 book ai didi

java - 根据异常自定义 Try/Catch 代码模板

转载 作者:搜寻专家 更新时间:2023-10-31 20:14:31 25 4
gpt4 key购买 nike

有谁知道是否有办法根据异常在 catch block 中自动生成不同的代码?

Eclipse 函数“Surround with try/catch”生成一个 try/catch block ,其中仅包含转储堆栈跟踪。

我在代码中做了很多类似的事情,所以我的大部分异常都可能归结为三种左右不同的类型。我希望每个代码都有不同的 catch block 代码,并根据异常设置 Eclipse 自动格式。

例如:如果我的代码生成 RemoteConnectionException,我想向用户显示一个对话框以重新连接。如果它生成 RemoteContentException,我想记录它。

(我编造的。)

提前致谢

更新:我一直在四处寻找并找到了两个可能的解决方案。

1) 我找到了一个叫做快速代码插件的东西,它可能会满足我的需求。 http://fast-code.sourceforge.net/index.htm

2) 对于专门处理异常,我可能只编写一个通用异常处理程序并修改 catch block 代码以将异常传递给它,而不是打印堆栈跟踪。然后 java 代码将根据异常类型确定采取哪种操作。

最佳答案

模板有其局限性。但是,您的问题可以通过 Aspect 非常优雅地解决。 ( http://www.eclipse.org/aspectj/ ) 只需为您需要的每种类型的“模板案例”创建一个新注释并使用环绕建议。

注意:不要将 printStackTrace() 用于 syserr/sysout。有这么多生产级、轻量级的日志框架……请不要滥用可怜的小 System.out/err :)

编辑:

日志记录/基准测试建议的一些示例。 (注意:我在方面使用 spring AOP,并使用 lombok 来轻松访问日志框架。getCurrentUser() 代码在这里并不真正相关,它只是为了获取当前用户来自 Spring Security)

package com.XXXXXXXX.aspects;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;

@Component
@Aspect
@Slf4j
public class LoggerAspect {

private final static String DOMAIN = "XXXXXXXX";

private static String getCurrentUser() {
String username = "Unknown";
try {
Object principal = SecurityContextHolder.getContext().
getAuthentication().
getPrincipal();
if (principal instanceof UserDetails) {
username = ((UserDetails) principal).getUsername();
} else {
username = principal.toString();
}
} catch (Exception e) {
}
return username;
}

@Pointcut("within(com.XXXXXXXX.services..*)")
public void inServiceLayer() {
}

@Pointcut("execution(* getMatcherInfo(..)) || execution(* resetCounter(..))")
public void notToAdvise() {
}

@Around("com.XXXXXXXX.aspects.LoggerAspect.inServiceLayer() && !com.XXXXXXXX.aspects.LoggerAspect.notToAdvise()")
public Object doLogging(ProceedingJoinPoint pjp)
throws Throwable {
long start = System.nanoTime();
StringBuilder sb = new StringBuilder(DOMAIN);
sb.append('/').
append(getCurrentUser()).
append(" accessing ").
append(pjp.getSignature().
getDeclaringTypeName()).
append('.').
append(pjp.getSignature().
getName());
log.trace("START: " + sb.toString());
Object retVal = pjp.proceed(pjp.getArgs());
long duration = System.nanoTime() - start;
log.trace("STOP: " + duration / 1000000 + " msec. " + sb.toString());
return retVal;
}
}

关于java - 根据异常自定义 Try/Catch 代码模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11301622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com