2010-05-18 105 views
5

的异常中操作我知道这可能是一个有点古怪,但怀疑毕竟是一个疑问...... 在以下情况下会发生什么......异常在C#

private void SendMail() 
{ 
    try 
    { 
     //i try to send a mail and it throws an exception 
    } 
    catch(Exception ex) 
    { 
     //so i will handle that exception over here 
     //and since an exception occurred while sending a mail 
     //i will log an event with the eventlog 

     //All i want to know is what if an exception occurs here 
     //while writing the error log, how should i handle it?? 
    } 
} 

谢谢。

回答

4

我会亲自包装调用以写入事件日志与另一个try \ catch语句。

但是,最终取决于您的规格。如果系统将故障写入事件日志至关重要,那么您应该允许将其抛出。然而,根据你的例子,我怀疑这是你想要做的。

+6

+1。顺便说一句:“哟狗,我听说你喜欢捕捉异常,所以我把一个尝试抓住你的试验抓住,所以你赶上,而你赶上。” :) – ANeves 2010-05-18 09:39:03

+0

哈哈辉煌!!!!!!!就我而言,本周评论! – 2010-05-18 09:55:06

+0

嘿大卫, 即使我相信你是正确的,我们应该让第二个异常被抛出,因为最终如果在那里抛出一个异常,那么这将意味着客户端机器存在的问题.... 和我们的第一个偏好是与我们的应用程序相关的例外... 但是我怎么知道我的应用程序中发生了什么错误,因为既没有发送邮件也没有记录错误? 任何建议好友 – Shrewdroid 2010-05-18 10:00:58

0

您也可以在catch块中添加try-catch块。

1

每个异常仅在try-catch块内被捕获。你可以嵌套尝试,但通常不是一个好主意。

+0

对,嵌套try-catch块感觉“脏”。但是,没有什么别的办法可以做。 – 2010-05-18 09:41:11

0

考虑到写入文件时的异常类型(权限,磁盘空间...)我建议不要在这里处理它。如果第一次失败,很有可能无法在事件日志中写入事件日志中无法写入的信息...

让它冒泡并由上级处理试着抓。

4

您可以简单地捕获错误记录方法中的错误。但是我不会亲自这样做,因为错误日志记录是您的应用程序根本无法运行的标志。

private void SendMail() 
{ 
    try 
    { 
     //i try to send a mail and it throws an exception 
    } 
    catch(Exception ex) 
    { 
     WriteToLog(); 
    } 
} 

private void WriteToLog() 
{ 
    try 
    { 
     // Write to the Log 
    } 
    catch(Exception ex) 
    { 
     // Error Will Robinson 
     // You should probably make this error catching specialized instead of pokeman error handling 
    } 
} 
+0

+1 Yep - writeToLog应该处理自己的异常(抑制或抛出) – 2010-05-18 19:20:00

0

Chris S.有最好的答案。在catch块内放置try-catch块是非常不明智的。并在你的情况下,它会只是缠绕你的代码。如果您在这里查看是否成功写入日志文件,那么您必须在每个尝试写入日志文件的地方执行此操作。在通知/处理这些模块中的错误条件时,您可以通过让所有单独的模块自成一体,轻松避免这种不必要的代码重复。当您的邮件发送失败,你执行你的catch块内适当的行动来处理这一特殊情况,如:

  1. 处置您的邮件对象
  2. 的确保您的插座已关闭
  3. 内容编写的条目到你的日志文件中注意错误

在你的catch块中,只需调用你定义的任何API来将日志条目写入你的日志文件中,而忘记其余的。在你的日志API里面,你应该处理任何与日志有关的例外情况(磁盘已满,没有写入文件的权限,找不到文件的权限等等)。您的邮件模块不需要知道日志记录是否成功,应该将责任委派给日志记录模块。

0

我个人使用简单的扩展方法来处理这种情况。

public static class MyExtentions 
{ 
    public static void LogToErrorFile(this Exception exception) 
    { 
     try 
     { 
      System.IO.File.AppendAllText(System.IO.Path.Combine(Application.StartupPath, "error_log.txt"), 
       String.Format("{0}\tProgram Error: {1}\n", DateTime.Now, exception.ToString())); 
     } 
     catch 
     { 
      // Handle however you wish 
     } 
    } 
} 

的用法很简单:

try 
{ 
    ... 
} 
catch(Exception ex) 
{ 
    ex.LogToErrorFile(); 
} 

然后,您可以处理扩展方法中捕捉到的异常,但是你想,或者干脆不抓住它,让它泡到顶部。我发现这种设计是一种简单,可重复的方式来处理整个应用程序中的异常。

0