探讨在项目中如何处理错误信息

一个项目中肯定需要处理各种各样的错误。而对于这些错误,一方面需要程序反应出这些错误并可以让程序员快速地
定位到,另一方面,在发生某些错误时需要给用户适当的错误提示。比如某个请求的方法是

public User getUserInfo(String userId)

此时请求参数userId为null,我在项目中会这么做

public User getUserInfo(String userId){
    Assert.notNull(userId, "userId不能为空");
    // ..
}

并且用一个全局的异常捕捉的类来处理系统中的所有异常,比如Spring中的HandlerExceptionResolver

    public ModelAndView resolveException(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex) {

        Map map = new HashMap();
        map.put("success", false);
        map.put("message", ex.getMessage());
        try {
            sendJson(response, Utils.parseJson(map));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new ModelAndView();
    }

这样就可以将错误信息返回给客户端。当然为了更好的支持多国用户,可以考虑对错误信息做国际化处理,这里就不具体展开来讲了。不过这里需要注意的是,不能想当然地使用ResouceBundle来处理,因为这里需要处理的是客户端用户,而用ResourceBundle只是根据服务器的语言环境。
对于错误信息的管理,我们还是将其放到配置文件中,这样不仅可以便于修改,并且可以在后期提供国际化。
但是当项目越来越大的时候,把所有类使用的错误信息存储到一个大的属性文件里边将会容易产生维护的噩梦。为了避免这一情况,我们可以借鉴Tomcat中的处理方法:为每个包都分配一个属性文件。例如,在包org.apache.catalina.connector里边的属性文件包含了该包下所有的类抛出的所有错误信息。每个属性文件都会被一个org.apache.catalina.util.StringManager类的实例所处理。当Tomcat运行时,将会有许多StringManager实例,每个实例会读取包对应的一个属性文件。
当包里边的一个类需要产生一个错误信息时,它首先会获得一个StringManager实例。不过,相同包里边的其他一些类可能也需要 StringManager,为每个对象创建一个 StringManager 实例是一种资源浪费。因此,StringManager 类被设计成一个单例 (singleton)类。仅有的一个构造方法是私有的,你不能在类的外部使用 new关键字来实例化。只能传递一个包名来调用它的公共静态方法getManager来获得一个实例。每个实例存储在一个以包名为keyHashtable 中。

private static Map<String, StringManager>managers = new HashMap<String, StringManager>();

public synchronized static StringManager getManager(String packageName) {
    StringManager mgr = (StringManager)managers.get(packageName);
    if (mgr == null) {
        mgr = new StringManager(packageName);
        managers.put(packageName, mgr);
    }
    return mgr;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值