2010-07-02 58 views
3

我有这样的应用程序结构: 1.表示层调用 2.业务逻辑层又调用 3.数据访问层做数据库处理。异常处理帮助

现在我有一个联系人页面,我可以在其中添加一个新联系人到数据库。

因此,要添加一个新的联系人,我填写所有必需的细节,然后从该页面调用Add方法(驻留在BLL中),该方法依次调用驻留在DAL中的Add方法。

DAL中的此方法返回记录的当前标识,然后返回到BLL方法并最终在页面上传递。

这很好。但如果得到一个异常,我该如何处理它,因为DAL中的方法具有返回类型的int,我不想抛出另一个错误!另外明智的是,我将不得不写几乎所有的方法。

//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; 
} 

,而我想向用户显示一个用户友好的消息,他们可以很容易地理解和平均值,而我会发送邮件到我自己记录的是刚发生的错误。

也请亲切告诉我如何实现我的自定义异常类。

请告诉我,我该如何做到这一点!

谢谢。

+4

如果我告诉你你已经知道了什么,请原谅我,但是你是否意识到你不需要捕获异常 - 如果单独留下,他们将直接通过这些方法冒泡,直到它们碰到异常处理程序(如果存在一)?因此,您可以简单地使用友好的消息来引发异常,并在表示层中拥有全局处理程序来捕获它们。 虽然像@亨克说的,你应该真的抓住他们在每一层的边界。演示文稿不应该从低层明确知道特定的异常类型,例如SQLException。 – 2010-07-02 10:26:11

回答

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()); 
    } 
} 
产生弹出
3

你不应该在每种方法中都需要try/catch。但你通常需要在每个图层(对于某个动作)尝试/捕获。

这是正确的,每一层都有对付自己的破合约,清理等

从异常转换为“友好的消息”是后话了GUI,而不是下层。

当你赶上并重新抛出异常,请确保你没有松动的信息,将其转发在InnerException属性:

try 
{ 
    // DAL 
} 
catch (DALException de) 
{ 
    // Log, .... 

    throw new BLLException(message, de); 
} 
+0

更正了错字。 – 2010-07-02 10:37:09