2009-12-27 56 views
0

我創建了一個自定義異常與自定義異常諮詢

public class InvalidUsernameException : ApplicationException 
{ 
    public InvalidUsernameException() 
    { 
    } 
} 

後,我拋出此異常的方法

public static DataTable GetTableForApproval() 
{ 
    using (var connection = Utils.Database.GetConnection()) 
    using (var command = new SqlCommand("SELECT [UserID], [Username], [Email], [Role], [Date] FROM [Users] WHERE [Role] = @role", connection)) 
    { 
     command.Parameters.AddWithValue("@role", "Waiting"); 
     using (var reader = command.ExecuteReader()) 
     { 
      if (reader == null || !reader.HasRows) 
       throw new NoFormsForAuthenticaionException(); 

      var table = new DataTable(); 

      table.Columns.Add("UserID", typeof(int)); 
      table.Columns.Add("Name", typeof(string)); 
      table.Columns.Add("Email", typeof(string)); 
      table.Columns.Add("Role", typeof(string)); 
      table.Columns.Add("Registration date", typeof(DateTime)); 

      while (reader.Read()) 
       table.Rows.Add((int)reader["UserID"], (string)reader["Username"], (string)reader["Email"], (string)reader["Role"], (DateTime)reader["Date"]); 

      return table; 
     } 
    } 
} 

當我使用這些方法,我捕捉到了異常

try 
{ 
    GvApproveUser.DataSource = Authentication.GetTableForApproval(); 
    GvApproveUser.DataBind(); 
} 
catch (NoFormsForAuthenticaionException) 
{ 
    Error.HandleError("There is no forms for approval"); 
} 

這是錯誤頁面背後的代碼

public partial class Error 
{ 
    public static string GetUrl(string message) 
    { 
     return string.Format("~/Error.aspx?errorMessage={0}", message); 
    } 

    public static void HandleError(string message) 
    { 
     HttpContext.Current.Response.Redirect(GetUrl(message), false); 
    } 

    protected override void OnPreRender(System.EventArgs e) 
    { 
     base.OnPreRender(e); 

     LblError.Text = ErrorMsg; 
    } 

    private string ErrorMsg 
    { 
     get 
     { 
      return Request["errorMessage"] ?? string.Empty; 
     } 
    } 
} 

是否有更簡單的方法發佈此錯誤消息?我可以在不違反三層架構規則的情況下做到這一點嗎?有另一種方法嗎?

public class InvalidUsernameException : ApplicationException 
{ 
    public InvalidUsernameException() 
    { 
     Error.HandleError("There is no forms for approval"); 
    } 
} 
+1

方不要:這是最好的做法是從Exception繼承而不是ApplicationException的 - http://msdn.microsoft.com/en-us/library/seyhszts.aspx 你應該不叫裏面Error.HandleError你的Exception類。該班的目的是報告一個例外。所以你以前的代碼讀得更好。 – 2009-12-27 12:01:47

回答

2

首先要注意的是,您正在使用的例外情況看起來並不是特殊情況;沒有行似乎既是一個合理的和預期的事態。所以,如果不是特例,請不要使用例外。

我可能會改變數據訪問方法不會拋出,然後簡單地檢查是否有表中,這意味着你的代碼將簡化到像這樣的任何行:

var table = Authentication.GetTableForApproval(); 
if (table.Rows.Count == 0) 
{ 
    Error.HandleError("There are no forms for approval"); 
} 

GvApproveUser.DataSource = table; 
GvApproveUser.DataBind(); 

的下一個潛在的簡化就是決定你是否真的想重定向到這樣的錯誤頁面。爲什麼不只是顯示一條消息而不是gridview,表示沒有什麼可以批准?然後將它全部保留在一頁上,因爲只有一個頁面沒有自定義的例外,並且沒有特殊的錯誤頁面,所以一切都變得非常簡單。

var table = Authentication.GetTableForApproval(); 
if (table.Rows.Count > 0) 
{ 
    GvApproveUser.DataSource = table; 
    GvApproveUser.DataBind(); 
} 
else 
{ 
    // hide the gridview and show a message 
}