使用Enterprise Library的ASP.NET MVC应用程序中的异常管理

时间:2011-11-24 16:11:06

标签: c# .net asp.net-mvc exception-handling enterprise-library

我需要一些有关异常管理最佳实践的信息。不是如何编写代码,有很多关于它的信息,但更多的是在不同的层中如何处理它(我们在.NET中有MVC应用程序),包装什么等等。

只是理论信息。我们想要使用企业库。

修改

感谢您的回答,但我正在寻找更多建筑信息。我在网上看过很多文章,比如关于codeproject的一些文章,一些关于msdn的文章以及更多文章,但大部分是他们在编码级别上解决了这个问题:(

我确定我会使用企业库,但我必须弄清楚这个场景(我希望我说id正确) 这个非常有用

enter image description here

4 个答案:

答案 0 :(得分:3)

我更喜欢在global.asax中的“Application_Error”中使用错误日志记录。这使您可以捕获Web应用程序中发生的任何异常。当从不可靠的源(例如db访问)获取输入时,我也使用try-catch。

我记得这是一个精彩的读物: http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx

关于我的产品情景: 我们有IIS服务器动态上下运行,以便为系统负载和节省开支。我将错误记录到专用数据库,因为我无法从已关闭的服务器获取日志。从多个服务器收集日志也非常不舒服。我记录了e.ToString(),因为它保存了消息和堆栈跟踪。另一个巧妙的技巧:我在e.ToString()上执行md5哈希并将其保存在errors表的单独列中。如果此哈希已经存在,我会增加一个计数器。即我将错误分组以使我能够轻松地了解频率。这也允许您在记录后将用户重定向到您选择的错误页面。我这样做:

Response.Redirect("ErrorPage.html?e=" + errorHash);

在html文件中,我从查询字符串中显示错误的哈希值。

答案 1 :(得分:2)

我写了几篇关于异常处理的博客文章。您可以在此处找到它们:http://blog.gauffin.org/tag/exceptions/

我基本上说的是:

  

不要抓住那个例外!

理解在大多数情况下你不应该捕获异常,除非你真的能够处理它们(或者在顶层),这一点非常重要。

至于ASP.NET MVC,我已经写过关于处理错误的正确方法:http://blog.gauffin.org/2011/11/how-to-handle-errors-in-asp-net-mvc/

答案 2 :(得分:1)

如果您需要应用程序范围的错误记录工具,我会指导您查看elmah。基本上它是一个不显眼的IIS插件,为您的应用程序提供异常处理。它还提供了许多查看这些异常的方法。

如果您想要一个可用于异常报告以及应用程序日志记录的通用日志记录框架,请查看log4net。

除此之外,真正的问题是,当发生异常时,您需要记录什么。对于初学者,我会记录重现导致错误的事件过程所需的所有信息。

每个应用程序/公司都不同,所以请与您的团队,同事交流,并在此基本规则的基础上讨论您还需要什么。

答案 3 :(得分:-1)

可以为每个dll甚至每个类创建自定义异常类。对于抛出的每个自定义异常,创建一个自定义ID以与用于跟踪的描述一起使用,它用于控制向用户显示的消息。 ID或ID范围,确定向用户显示的友好消息。通过这种方式,您可以确定抛出的异常,捕获和处理的异常,未捕获和处理的异常,自定义异常,以及跟踪,分类和查找抛出异常的代码等等。要将记录添加到混合中,您可以使用log4net或common.logging(与Entlib一起使用)。这使得日志记录变得简单,因为它易于使用和实现,并且内置了用于记录所有有用信息的异常的功能,并且可以在应用程序范围内使用。

增加: 我想我的Base Exception Class可能有错,你会注意到DebugFormat和ErrorFormat,这是我们修改过的log4net代码,不过我觉得你明白了。

namespace Playing.Service
{
    public class UserService
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(UserService));

        public void SaveUser(string username, string firstName, string lastName)
        {
            try
            {
                Playing.Repository.UserRepository repository = new Repository.UserRepository();

                repository.SaveUser(username, firstName, lastName);

                log.DebugFormat("Saved User Info");
            }
            catch (Repository.RepositoryException rex)
            {
                log.ErrorFormat("Repository Could Not Save User Information: {0}\n Error Message: {1}\nStack Trace: {2}", rex.Message, rex, rex.StackTrace);
                throw new ServiceException(rex.Message, 2400);
            }
            catch (Exception ex)
            {
                log.ErrorFormat("Could Not Save User Information: {0}\n Error Message: {1}\nStack Trace: {2}", ex.Message, ex, ex.StackTrace);
                throw new ServiceException(ex.Message, 12400);
            }
        }
    }


    public class ServiceException : Playing.Common.BaseException
    {
        public ServiceException(string errorMessage) : base(errorMessage) {}
        public ServiceException(string errorMessage, int errorID) : base(errorMessage, errorID) {}
        public ServiceException(string errorMessage, params string[] args) : base(errorMessage, args) { }
    }
}

namespace Playing.Repository
{
    public class UserRepository
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(UserRepository));

        public void SaveUser(string username, string firstName, string lastName)
        {
            try
            {

                //Save data in Database
                log.DebugFormat("Saved User Info Into Databse");

            }
            catch (Exception ex)
            {
                log.ErrorFormat("Could Not Save User Information: {0}\n Error Message: {1}\nStack Trace: {2}", ex.Message, ex, ex.StackTrace);
                throw new RepositoryException(ex.Message, 3400);
            }
        }
    }


    public class RepositoryException : Playing.Common.BaseException
    {
        public RepositoryException(string errorMessage) : base(errorMessage) {}
        public RepositoryException(string errorMessage, int errorID) : base(errorMessage, errorID) {}
        public RepositoryException(string errorMessage, params string[] args) : base(errorMessage, args)  {}
    }
}

namespace Playing.Common
{
    public class BaseException : Exception
    {
        public BaseException(string errorMessage) : base(errorMessage) {}

        public BaseException(string errorMessage, int errorID) : base(errorMessage) 
        { 
            StringBuilder error = new StringBuilder();

            error.Append("(");
            error.Append(errorID);
            error.Append("): ");
            error.Append(errorMessage);

            errorMessage = error.ToString();
        }

        public BaseException(string errorMessage, params string[] args) : base(errorMessage) 
        {
            errorMessage = string.Format(errorMessage, args);
        }
    }
}