对一个ERP产品的认识-------之例外抛出机制

wooddoor 2002-10-24 11:46:19
作者:yyand23
qq :752397
email:yyand23@yahoo.com.cn
这篇文章主要介绍该ERP系统中的例外机制:
一.对发生例外的位置的确定以及出错原因的描述。
这个软件系统主要分为数据操作层,业务逻辑层,界面层等等,每一层都有特定的的例外。比如说数据操作层的例外最终都是由DAOException的抛出。
例如:
try {
conn = this.getConnection();
} catch (DataSourceException ex) {
throw new DAOException("0030", ex);
}
在DAOException类中有这样的定议:
{ "0030", "更新记录错误", "获取连接错误", "参考源错误类型" }
说明”0030”是表示 “获取连接错误”,然后通过一定的例外传递机制把例外抛出到界面上。(文章最后我将写怎么把外面显示到界面上).
因为每层定议的出错类各不相同,比如数据层是DAOException,逻辑层是BOException.这样就可以根据抛出的例外类型来判断出出错的位置。
二.例外类的实现。
第一部分:
所有例外类的父类BaseException
public abstract class BaseException extends Exception
它是ERP软件中所有抛出例外的父类。
1. 其中主要定议了以下几个字段:

/**
* 具体的例外类型错误编码,该编码代表一个具体的错误。(如上面的"0030")
*/
private String errorCode;

/**
* 例外简短名称。(如上面的"更新记录错误")
*/
private String errorName = "";

/**
* 例外原因描述 (如上面的"获取连接错误")
*/
private String errorCause = "";

/**
* 例外解决办法建议。(如上面的"参考源错误类型")
*/
private String errorSolution = "";

/**
* 如果例外源为null,那么本例外是源例外。
* 否则,本例外是派生例外,派生例外是一个嵌套结构,嵌套的例外需要追溯到数据源例外,并直接显示源例外原因。(也就是说根据errorRoot可以查出所有嵌套的例外)
*/
Exception errorRoot = null;
2.类中定议了唯一的一个abstract方法:
public abstract ErrorDic getErrorDic();
这个方法用来取得具体的错误原因的描述。ErrorDic是一个类,用来传递一个二维的数组,数组中存放着所有例外的相关信息。
让我们先来看一个具体的子类,看看其中的getErrorDic()的定议。

第二部分:
BaseException一个子类
Public class DAOException extends BaseException
1. 作用:DAOException主要是用来处理对数据库进行操作时出现的例外。它把父类中的抽象方法实现为:
public ErrorDic getErrorDic() {
if (dic == null) {
dic = new ErrorDic();
String[][] errors = new String[][] {
{ "0000", "未知错误", "未知错误原因", "没有提供错误解决办法" },
{ "0001", "添加记录出错", "原因是不能获取数据源连接", "派生错误,请检查源错误解决办法" },
{ "0002", "添加记录错误", "原因是不能由连接创建动态SQL:[SQL]", "请检查SQL是否正确,并参考源错误" }

};
dic.setDic(errors);
}

return dic;
}
注:在新建一个DAOException,就直接调用它的父类的构造器,如下所示范:
public DAOException(String errorCode, java.util.HashMap params, Exception ex) {
super(ERRORTYPE_DAO, errorCode, params, ex);
}
这样就在父类的构造器中对错误信息进行整理,以便最终显示到界面上。
第三部分:
对错误信息进行整理,以便最终显示到界面上。
我把一个对例外的处理的具体例子写在下面:
try {
constructors = Class.forName(SIImpl).getConstructors();
}
catch(ClassNotFoundException ex){
HashMap map = new HashMap();
map.put("taskID", taskID);
map.put("_INIT",INIT);
map.put("SIImpl",SIImpl);
throw new TaskException("0018",map,ex);
}
它抛出TaskException时候同时把ex,map,0018,一起传给类。Ex中包括了以前的出错信息。Map在这里很重要,因为它可以把下面这句话变成良好的出错提示。像在TaskException有这样的定议:
{ "0018", "TaskBus处理错误", "TaskID:[taskID]没有注册", "检查注册文件resource/bus/TaskBus.xml是否包含该注册项" }
在BaseException的构造器中就把[taskID]改为map中的[taskID]放的信息了。这样出错提示就不再是:
"TaskID:[taskID]没有注册"
而是:
"TaskID:XXXXtaskID没有注册".

第四部分:
在页面显示出错的信息。
有两种出错提示方法。
1. 弹出一个windows 的messageBox的对话框.
我们的软件是在servlet中用javascript来实现的。代码如下:
/**
* 弹出对话框提示用户,并且刷新指定页面
*/
public void messageBox(
javax.servlet.http.HttpServletResponse response,
String msg,
String url,
String target) {
PrintWriter out;
try {
response.setContentType("text/html; charset=gb2312");
out = response.getWriter();
out.println("<html>");
out.println("<head><title>提示</title></head>");
out.println("<body>");
out.println("<form name='hiddenForm' method='post'></form>");
out.println("<script language=\"javascript\">");

out.println("alert(\"" + msg + "\");");
if ( url != null &url.indexOf("/view/share/menu/tempindex.htm")!=0) {
out.println("document.all.hiddenForm.action = \"" + url + "\";");
out.println("document.all.hiddenForm.target = \"" + target + "\";");
out.println("document.all.hiddenForm.submit();");
}
out.println("</script>");
out.println("</body></html>");
out.close();
} catch (Exception e) {
}
}

2. 调用一个jsp页面。
在jsp页面中引入了一个javascript做的tree形式的控件,把错误信息显示出来。

整个软件中的例外机制大概就是这个样子。
欢迎和您的交流!!




...全文
45 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
wooddoor 2002-10-25
  • 打赏
  • 举报
回复
请提一点宝贵意见,可以吗?

67,514

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧