一个项目中肯定需要处理各种各样的错误。而对于这些错误,一方面需要程序反应出这些错误并可以让程序员快速地
定位到,另一方面,在发生某些错误时需要给用户适当的错误提示。比如某个请求的方法是
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
来获得一个实例。每个实例存储在一个以包名为key
的 Hashtable
中。
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;
}
原文地址:http://blog.csdn.net/u012345283/article/details/45082411