有没有人知道是否有办法根据异常自动在catch块中生成不同的代码?
Eclipse函数'Surround with try / catch'生成一个try / catch块,它只包含转储堆栈跟踪。
我在代码中做了很多类似的事情,所以我的大部分异常都可归结为大约三种不同的类型。我希望每个都有不同的catch块代码,并根据例外情况使用eclipse自动格式。
例如: 如果我的代码生成RemoteConnectionException,我想显示一个对话框供用户重新连接。 如果它生成一个RemoteContentException,我想记录它。
(我做了这些。)
提前致谢
更新: 我一直在四处寻找并有两个可能的解决方案。
1)我发现了一些叫做快速代码插件的东西,它可以做我正在寻找的东西。 http://fast-code.sourceforge.net/index.htm
2)为了专门处理异常,我可能只是编写一个通用异常处理程序并修改catch块代码以将异常传递给它而不是打印堆栈跟踪。然后java代码将根据异常类型确定要采取的操作。
答案 0 :(得分:4)
模板有它的限制。但是,使用Aspect可以非常优雅地解决您的问题。 (http://www.eclipse.org/aspectj/)只需为您需要的每种类型的“模板案例”创建一个新注释,并使用周围的建议。
Ps:不要将printStackTrace()用于syserr / sysout。有这么多生产级,轻量级日志框架.... pleeeaseee ...不要滥用可怜的小System.out / err:)
编辑:
日志记录/基准测试建议的一些示例。 (注意:我正在使用spring AOP用于方面,而lombok用于轻松访问日志框架。getCurrentUser()
代码在这里并不真正相关,它仅用于从Spring Security获取当前用户< / em>的
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;
}
}
答案 1 :(得分:0)
我不确定eclipse中是否有这样的选项。我一直在使用带有try / catch选项的环绕声很长一段时间它总是在异常e的catch块中转储默认的e.printStackTrace()行。