簡體   English   中英

嘗試捕獲塊的位置

[英]try catch block location

在以下情況下,我從業務層的數據訪問代碼中調用方法:

//Call the method from BL
SqlHandler sh = new SqlHandler();
var names = sh.GetNames();

DAL中的方法示例:

public IEnumerable<string> GetNames()
{
    string conString = GetOpenConnection();
    using (SqlConnection connection = new SqlConnection(conString))
    {
        connection.Open();
        using(SqlCommand cmd = new SqlCommand("SELECT Name From Names"))
        {
            //...
        }
    }
}

我需要記錄DAL中發生的任何異常,並使用適當的消息向用戶顯示一條消息。 據我所知,我有以下選擇:

1)僅環繞BL呼叫並記錄並從那里顯示消息:

try
{
    SqlHandler sh = new SqlHandler();
    var names = sh.GetNames();
}
catch (Exception ex)
{
    ex.LogException();
    MessageBox.Show(ex.Message);
}

2)環繞兩個電話,並將日志記錄部分和通知部分分為兩部分:

try
{
    SqlHandler sh = new SqlHandler();
    var names = sh.GetNames();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

public IEnumerable<string> GetNames()
{
    try
    {
        string conString = GetOpenConnection();
        using (SqlConnection connection = new SqlConnection(conString))
        {
            connection.Open();
            using (SqlCommand cmd = new SqlCommand("SELECT Name From Names"))
            {
                //...
            }
        }
    }
    catch (Exception ex)
    {
        ex.LogException();
        //propagate the exception to the caller
        throw;
    }
}

3)當然,我可能會在這里丟失一些我很想知道的東西

就應用程序體系結構而言,首選的方法是什么? 前兩者之間在功能上有區別嗎?

我建議第三個選項: 將錯誤日志記錄和錯誤顯示放在UI層中。

在您的用戶界面中注冊一個中央錯誤處理程序 在那里,你可以

  • 顯示錯誤(一個簡單的MessageBox或一個帶有“更多詳細信息”和“向開發人員報告”按鈕的精美窗口),並且

  • 記錄一切

不必用catch-all tr​​y-catch子句將每個 BL方法弄亂。

這有很多優點:

  • 這將使您的BL代碼更易於閱讀。
  • 您不能忘記 BL方法。
  • 對錯誤處理代碼進行(集中式)更改更容易。
  • 您無需將業務邏輯與特定類型的用戶界面耦合,該用戶界面本身具有很多優勢:例如,您可以稍后在基於Web的項目中重用它,並且可以使用單元測試來測試業務邏輯。 。

首先:始終捕獲您可以處理的異常( 請參閱Eric Lippert Post
您可以遵循以下策略:

  • 如果您無法從異常中恢復,請僅在DAL層中進行操作並將其記錄下來。
  • 如果用戶可以處理,請try {} catch{}在BAL層中try {} catch{}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM