良好的错误处理实践

时间:2008-09-30 21:36:35

标签: asp.net error-handling

asp.net网站有什么好的错误处理方法?例子?谢谢!

7 个答案:

答案 0 :(得分:9)

与任何.net项目一样,我发现最好的方法是只捕获特定的错误类型,如果它们可能在给定的页面上发生。

例如,您可以捕获给定输入的用户的格式异常(只是因为JavaScript验证失败并且您没有使用tryparse),但总是将顶级异常捕获留给全局错误处理程序。

     try
        {
            //Code that could error here
        }
        catch (FormatException ex)
        {
            //Code to tell user of their error
            //all other errors will be handled 
            //by the global error handler
        }

如果需要,您可以使用ASP.Net的开源elmah(错误记录模块和处理程序)来执行此顶级/全局错误捕获。

使用elmah,它可以创建一个错误日志,通过简单的配置Web界面可以查看。您还可以过滤不同类型的错误,并为不同的错误类型设置自己的自定义错误页面。

答案 1 :(得分:3)

我发现一种特别有用的做法是创建一个通用错误页面,然后将web.config的customErrors节点上的defaultRedirect设置为该错误页面。

然后设置你的global.asax来记录所有未处理的异常,然后将它们(未处理的异常)放在某个类的静态属性中(我有一个名为ErrorUtil的类,带有静态LastError属性)。然后,您的错误页面可以查看此属性以确定要向用户显示的内容。

此处有更多详情:http://www.codeproject.com/KB/aspnet/JcGlobalErrorHandling.aspx

答案 2 :(得分:0)

嗯,这是非常开放的,这是非常酷的。我会给你推荐一个单词.doc你可以从Dot Net Spider下载,这实际上是我小公司代码标准的基础。该标准包括一些非常有用的错误处理技巧。

例外的一个这样的例子(我不记得这是否是文档的原创或者如果我们将它添加到文档中): 永远不要“捕获异常并且什么都不做。”如果隐藏异常,您将永远不知道异常是否发生。您应该始终通过以编程方式检查所有错误条件来避免异常。

不做的示例:

try
{
   ...
}
catch{}

非常顽皮,除非你有充分的理由。

答案 3 :(得分:0)

您应该确保可以捕获应用程序生成的大多数错误,并向用户显示友好消息。但是当然你无法捕获所有错误,因为你可以使用另一个用户的web.config和defaultRedirect。记录错误的另一个非常方便的工具是ELMAH。 ELMAH将记录您的应用程序生成的所有错误,并以非常易读的方式显示给您。在应用程序中插入ELMAH就像在web.config文件中添加几行代码并附加程序集一样简单。你一定要试试ELMAH它会真正为你节省数小时的痛苦。

http://code.google.com/p/elmah/

答案 4 :(得分:0)

  1. 在每个页面中为您预期可能发生的异常进行防御性编码并适当地处理它们,以免每次发生异常时都扰乱用户。

  2. 使用引用记录所有异常。

  3. 为任何未处理的异常提供一般错误页面,该页面提供用于支持的参考(支持可以从日志中识别详细信息)。不要显示实际的异常,因为大多数用户都不会理解它,但由于它暴露了有关系统的信息(可能是密码等),因此存在潜在的安全风险。

  4. 不要捕获所有异常并且不对它们执行任何操作(如上面的答案)。几乎没有一个充分的理由这样做,偶尔你可能想要捕获一个特定的例外而不是故意做任何事情,但这应该明智地使用。

答案 5 :(得分:0)

将用户重定向到标准错误页面并不总是一个好主意。如果用户正在处理表单,他们可能不希望从他们正在处理的表单中重定向。我把所有可能导致异常的代码放在try / catch块中,并在catch块内部发出一条警告消息,警告用户发生了错误,并在数据库中记录异常,包括表单输入,查询字符串然而,我正在开发一个内部网站,所以如果他们遇到问题,大多数用户都会打电话给我。对于公共网站,您可能希望使用类似elmah的内容。

答案 6 :(得分:0)

public string BookLesson(Customer_Info oCustomerInfo, CustLessonBook_Info oCustLessonBookInfo)
    {
        string authenticationID = string.Empty;
        int customerID = 0;
        string message = string.Empty;
        DA_Customer oDACustomer = new DA_Customer();

        using (TransactionScope scope = new TransactionScope())
        {
            if (oDACustomer.ValidateCustomerLoginName(oCustomerInfo.CustId, oCustomerInfo.CustLoginName) == "Y")
            {
                // if a new student
                if (oCustomerInfo.CustId == 0)
                {
                    oCustomerInfo.CustPassword = General.GeneratePassword(6, 8);
                    oCustomerInfo.CustPassword = new DA_InternalUser().GetPassword(oCustomerInfo.CustPassword, false);
                    authenticationID = oDACustomer.Register(oCustomerInfo, ref customerID);
                    oCustLessonBookInfo.CustId = customerID;
                }
                else // if existing student
                {
                    oCustomerInfo.UpdatedByCustomer = "Y";
                    authenticationID = oDACustomer.CustomerUpdateProfile(oCustomerInfo);
                }
                message = authenticationID;
                // insert lesson booking details
                new DA_Lesson().BookLesson(oCustLessonBookInfo);
            }

            else
            {
                message = "login exists";
            }
            scope.Complete();
            return message;
        }

    }