我创建了一个自定义异常
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;
}
}
}
是否有更简单的方式发布此错误消息?我是否可以在不违反3层架构规则的情况下这样做?还有另外一种方法吗?
public class InvalidUsernameException : ApplicationException
{
public InvalidUsernameException()
{
Error.HandleError("There is no forms for approval");
}
}
答案 0 :(得分: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
}