我有这个应用程序结构: 1.表示层调用 2.业务逻辑层反过来调用 3.数据访问层来处理数据库。
现在我有一个联系人页面,我可以在其中添加新联系人到数据库。
因此,要添加新联系人,请填写所有必需的详细信息,然后从页面调用添加方法(驻留在BLL中),然后调用驻留在DAL中的添加方法。
DAL中的此方法返回记录的当前标识,然后返回BLL方法并最终在页面上传递。
这很好。但是,如果得到一个异常,我如何正确处理它,因为DAL中的方法有一个int的返回类型,我不想再抛出一个错误!因为其他明智的我将不得不在几乎所有的方法中写try catch。
//something like this
public int AddMethod(ContactClass contactObj)
{
int result = 0;
try
{
result = ExecuteSomeSP("SPName", SP_Parameters);
}
catch(SQLException se)
{
throw new SQLException
}
return result;
}
而是我希望向用户显示一个用户友好的消息,他们可以很容易地理解这些消息,并且我将向自己发送一封邮件,记录刚刚发生的错误。
另外请告诉我如何实现自定义异常类。
请告诉我该怎么做!!
谢谢。答案 0 :(得分:3)
在每种方法中都不需要try / catch。但是你通常需要在每个 Layer 中使用try / catch(对于某个动作)。
这是正确的,每一层都必须处理自己破碎的合同,清理等。
从“异常”到“友好消息”的转换适用于GUI,而不是下层。
当你捕获并重新抛出异常时,请确保没有丢失信息,在InnerException属性中转发它:
try
{
// DAL
}
catch (DALException de)
{
// Log, ....
throw new BLLException(message, de);
}
答案 1 :(得分:1)
不要尝试捕获每个方法或层,只有它是合理的。尝试捕获应该永远不会像有条件的那样。表示层永远不应该有逻辑。
由于你使用DAL接口,我会创建一个自定义的DalException并将其抛出SQLException
public int addMethod(ContactClass contactObj) throws DalException {
try {
return ExecuteSomeSP("SPName", SP_Parameters);
}
catch(SQLException e) {
throw new DalException(e);
}
}
在您的业务逻辑层中捕获异常并使用表示层生成弹出窗口
public void addMethod(ContactClass contactObj) {
try {
dal.addMethod(contactObj);
}
catch(DalException e) {
// notify user
view.alert(e.getMessage());
}
}