2010-07-02 65 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