有自定义例外的建议

时间:2009-12-27 11:54:28

标签: c# asp.net

我创建了一个自定义异常

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");
    }
}

1 个答案:

答案 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
}