[英]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 try-catch子句將每個 BL方法弄亂。
這有很多優點:
首先:始終僅捕獲您可以處理的異常( 請參閱Eric Lippert Post )
您可以遵循以下策略:
try {} catch{}
在BAL層中try {} catch{}
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.