自定义异常类以警告错误和日志

时间:2011-01-12 11:14:00

标签: c# .net exception exception-handling

我现在正在为一些数据操作编写一个API,我遇到了一个我无法自己回答的问题:D

我创建了一个扩展.net Application Exception类的异常类,因为我想在每次API抛出异常时添加一些要执行的功能。 例如,我想通过短信和电子邮件提醒错误消息和堆栈跟踪,我想通过Log4net记录内部异常。我不知道这是否适合与自定义异常类一起使用,或者我是否过度使用了自定义异常的含义。

我已阅读this article有关如何在c#中扩展异常的内容 所以这里我们用我的代码示例:

public class CustomExceptionClass : Exception
{
    /// <summary>
    /// I use custom functionality here everytime this exception occures
    /// </summary>
    /// <param name="errorMessage">error message</param>
    /// <param name="innerEx">Inner exception that cause this exception</param>
    public MyCustomException(string errorMessage, Exception innerEx) : base(errorMessage, innerEx)
    {
        //log exception
        _log.ErrorFormat(errorMessage, innerEx);
        //alert via sms and email
        AlertMailer.SendAlertMessage(errorMessage, innerEx, innerEx.Message);
    }
}

4 个答案:

答案 0 :(得分:4)

我认为通过抛出自定义异常进行日志记录和警报是一种有效的技术。

但是,您不应该在异常构造函数中执行日志记录和警报。相反,您应该在API的所有入口点捕获自定义异常,并在catch块中执行日志记录和警报。例如:

void MyApiFunction()
{
    try
    {
        // do data manipulation
    }
    catch(MyCustomException ex)
    {
        _log.ErrorFormat(ex.ErrorMessage, ex.InnerEx);
        AlertMailer.SendAlertMessage(ex.ErrorMessage, ex.InnerEx);
    }
}

答案 1 :(得分:1)

我建议你改用APP。
PostSharp exception handling

答案 2 :(得分:1)

应使用自定义异常来定义不同类型的异常。

  • 数据库中的例外
  • 来自档案io
  • 的例外情况
  • 来自网络服务的例外

它们应该非常简单,除了分配变量之外不包含其他逻辑。为什么?因为如果异常构造函数抛出另一个异常,您将很难跟踪它。

处理这些例外的方式是:

  1. AOP(Spring.NET)
  2. 特定尝试/捕获
  3. 全局异常处理程序
  4. 在程序中

    namespace ConsoleApplication1 {
        class Program {
            static void Main(string[] args) {
                try {
                    //do something
                } catch(Exception e) {
                    //log error
                }
            }
        }
    }
    

    或在网站

    public class ApplicationErrorModule : IHttpModule {
    
        public void Init(HttpApplication context) {
            context.Error += new EventHandler(context_Error);
        }
    
        private void context_Error(object sender, EventArgs e) {
            //log error
        }
    }
    

答案 3 :(得分:0)

记录和发送电子邮件等重度处理不属于异常的构造函数。您应该使用AOP作为@petro建议或在catch语句中处理异常。