C#中的异常中的异常处理

时间:2010-05-18 09:13:27

标签: c# exception exception-handling

我知道这可能有点奇怪,但怀疑是一个怀疑... 在以下情况下会发生什么......

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??
    }
}

谢谢。

8 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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
    }
}

答案 2 :(得分:1)

只有在try-catch块内部才会捕获每个异常。你可以嵌套try-catch,但通常不是一个好主意。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

让它冒泡并由上层try / catch处理。

答案 5 :(得分:0)

Chris S.有最好的答案。在catch块中放置一个try-catch块很少是一个好主意。在你的情况下,它只会卷入你的代码。如果您在此处检查是否成功写入了日志文件,则必须在尝试写入日志文件的每个位置执行此操作。在通知/处理这些模块中的错误条件时,可以通过使所有单个模块自包含来轻松避免这种不必要的代码重复。发送邮件失败时,您可以在catch块中执行适当的操作来处理这种异常情况,例如:

  1. 处理邮件对象的内容
  2. 确保您的套接字已关闭
  3. 在日志文件中写入条目以记录错误
  4. 在catch块中,只需调用您定义的任何API,将日志条目写入日志文件,然后忘记其余的。在您的日志记录API中,您应该处理任何与日志记录相关的异常情况(磁盘已满,没有写入文件的权限,找不到文件等等)。您的邮件模块无需知道日志记录是否成功,应将该职责委托给日志记录模块。

答案 6 :(得分: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();
}

然后,您可以根据需要在扩展方法中处理捕获的异常,或者只是不捕获它并让它冒泡到顶部。我发现这个设计是一种简单,可重复的方法来处理整个应用程序中的异常。

答案 7 :(得分:0)

  • 首先我要说的是不要在catch块中捕获“Exception”。相反,您可以检查所有有效性,然后捕获您可以执行某些操作的特定异常(SmtpException)(并通过友好消息通知用户)。从您的代码中抛出异常并通知UI并不是一个坏主意。如果您的方法接受具有特定规范的输入,并且如果它们不符合,则您的方法应该/可以抛出错误并通知用户它。

  • 对于无法控制的异常,请使用全局处理异常,例如Web的Application_Error。 Getting Better Information on Unhandled Exceptions Peter Bromberg更好地解释了这一点。

  • 此外,对于您正在访问的任何私有资源(如事件日志),请确保程序集可以访问它。

  • 有用的链接Build a Really Useful ASP.NET Exception Engine By Peter A. BrombergDocumenting Exceptional Developers By Peter A. Bromberg 对于Web应用程序,请查看 Health monitoring Exception logging

  • 还有一件事,如果您的应用程序出错/抛出无法处理的错误(根本没有),最好让它优雅地继续下去而不是继续。在不稳定状态下应用并不是一个好主意。