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

有没有人知道是否有办法根据异常自动生成catch块中的不同代码

Eclipse函数’Surround with try / catch’生成一个try / catch块,它只​​包含转储堆栈跟踪.

我在代码中做了很多类似的事情,所以我的大多数异常都可以归结为大概三种不同的类型.我想为每个人提供不同的catch块代码,并根据异常设置eclipse自动格式.

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

(我做了这些.)

提前致谢

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

1)我发现了一些叫做快速代码插件的东西,它可能正在寻找我正在寻找的东西.
http://fast-code.sourceforge.net/index.htm

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

最佳答案
模板有它的限制.但是,使用Aspect可以非常优雅地解决您的问题. (http://www.eclipse.org/aspectj/)只需为您需要的每种“模板案例”创建一个新注释,并使用周围的建议.

Ps:不要将printstacktrace()用于syserr / sysout.有这么多生产级,轻量级日志框架…. pleeeaseee …不要滥用可怜的小System.out /错误:)

编辑:

记录/基准测试建议的一些示例. (注意:我正在使用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;
    }
}

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...