2012-03-16 121 views
2

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

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

此外,当我们有一连串的尝试捕获互相调用时,我对如何以及何时向最终用户显示错误消息感到困惑。

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(); 
    } 
} 
+0

号见http://msdn.microsoft.com/en-us/library/ms229014.aspx – 2012-03-16 07:10:29

+0

可能重复[Windows窗体应用程序中的异常处理的最佳实践?](http://stackoverflow.com/questions/183589/best-practice-for-exception-handling-in-a-windows-forms-application) – 2012-03-16 07:11:06

回答

5

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

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

1.你不应该赶上你不能处理

很重要的例外。所有只是重新抛出或记录异常的异常块都会在不增加任何值的情况下混乱代码。只捕获最顶层(web服务,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/

+0

如果我我正在使用像MVP模式一样的层架构做最顶层的意思表示。您是否建议在此层中异常更好。 – arjun 2012-03-16 07:24:05

+1

是的。只捕获您可以在库中处理的异常。捕捉表示层中的所有其他异常。你可以使用'Application.ThreadException'来捕获所有未处理的异常(然后通过电子邮件发送) – jgauffin 2012-03-16 07:30:27

+0

当我们抛出异常 - 抛出新的CustomException(“试图分配一些很酷的东西”,错误) - 它停止正常执行的程序。这是否意味着我们无法处理例外情况。 – arjun 2012-03-16 08:46:10

1

或许可以考虑使用类似ELMAH就像log4net的可以配置使得它记录错误的文件,数据库表,或发送电子邮件。