异常记录和发送电子邮件

本文关键字:电子邮件 记录 异常 | 更新日期: 2023-09-27 18:27:55

以下异常处理方法正确吗?我发现很难记录错误并最终通过电子邮件发送日志文件。我在哪里写代码来记录错误并发送电子邮件?

我遇到的一个主要问题是,当异常在SomeClass1中生成时,它会被记录两次——第二次是在SomeClass2中。创建一个单独的自定义异常类型(示例中为SomeException)并在System.Exception出现时包装它,这是一个好主意吗?

此外,当我们有一系列相互调用的try-catch时,我对如何以及何时向最终用户显示错误消息感到困惑。

class SomeClass1
{
    public static DataExtract(string sourcepath)
    {
        try
        {
            OleDbConnection oledb = new OleDbConnection();
            oledb.ConnectionString = "someconnectionstring";
            CompanyOLEDB.Open();
        }
        catch (Exception e)
        {
            throw new CustomException(e);
        }
    }
}

class SomeClass2
{
    private void SomeMethod()
    {
        try
        {
            // some code
            // some code
            SomeClass1.DataExtract()
        }
        catch (Exception e)
        {
            throw new CustomException(e);
        }
    }
}

public class CustomException : Exception
{
    protected CustomException() { }
    public CustomException(Exception e)
    {
        Log(e);
    }
    public CustomException(ExceptionType type)
    {
        this.Data.Add("Type", type);
        this.Data.Add("Message", "No message specified");
    }
    public CustomException(ExceptionType type, string message)
    {
        this.Data.Add("Type", type);
        this.Data.Add("Message", message);
    }
    public static void Log(Exception e)
    {
        System.IO.File.WriteAllText(Logfile.txt", e.ToString());
    }
    public static void Sendmail()
    {
        ExceptionMail.Sendmail();
    }
}

异常记录和发送电子邮件

以下异常处理方法是否正确?

没有。有几个问题。这是两个最重要的。

1.您不应该捕获无法处理的异常

非常重要。所有只重新抛出或记录异常的异常块都会在不添加任何值的情况下扰乱代码。只捕获最顶层(webservice、MVC控制器、后台线程等)中的所有异常,以防止应用程序崩溃。(但是,有时让应用程序崩溃是更好的)。

如果方法可以返回预期值,则已处理异常。

2.始终包括原始异常

当您仅从原始异常中复制部分信息时,您正在隐藏重要信息,以便将来能够阻止这些信息。

如果你必须抓住/扔别人,你应该这样做:

public class CustomException : Exception
{
    public CustomException(string msg, Exception inner) : base(msg, inner){}
}

//以及一种方法:

public void DoSomething()
{
    try
    {
        SomeCoolOp();
    }
    catch (Exception err)
    {
        throw new CustomException("Tried to allocate some cool stuff", err);
    }
}

与您的代码相比的变化:

  1. 我们按照Microsoft建议的方式包含原始异常
  2. 我们编写一条operation specific消息,即描述异常发生时我们试图做什么(而不是使用原始消息)

更多信息

我写过几篇关于异常处理的博客文章。

您可以先阅读:http://blog.gauffin.org/2010/11/do-not-catch-that-exception/

然后阅读其余部分:http://blog.gauffin.org/tag/exceptions/

也许可以考虑使用类似ELMAH的东西,就像Log4Net一样——它可以被配置为将错误记录到文件、数据库表或电子邮件中。