0

.Net 框架版本:3.5

我有一个程序可以处理所有可以生成的异常。这会导致大量的 catch 块,其中许多是从一种方法到另一种方法的重复。我想将所有捕获处理收集到一个方法中。例如:

string catch_processing ( Exception  e )
    {

    }

在此示例中,该方法将返回 thee.Message和 thee.StackTrace以及任何其他相关信息。我的问题是“其他信息”。我想区分异常,例如

switch ( e )
    {
    case PathTooLongException:
        :
        break;

    case DirectoryNotFoundException:
        :
        break;

    default:
        :
        break;
    }

我不确定如何实现此方法,希望得到一些指导。

4

5 回答 5

1

一个TryCatchLog静态方法已发布到 CodeReview,它可以完成我认为您正在尝试做的事情;exceptionSubscriber.TryCatchLog(Statements...)将捕获由 抛出的任何异常Statements...,将它们记录到exceptionSubscriber并重新抛出。

但是,在复制该代码之前,请停下来解释一下您要完成的工作。“程序要求报告所有异常”是一个非常可疑的声明,因为运行时已经报告未处理的异常,而您无需执行任何操作。另一个非常可疑的事情是,throw您的catch_processing.

在抛出任何异常后,您不会尝试继续,是吗?把它从一个错误的时代的老手那里拿来ON ERROR GOTO;尝试在异常后继续的程序往往会失败并且很难调试。他们会抛出异常,继续运行,显示错误结果,继续运行,损坏数据,继续运行,然后启动一连串错误,这些错误都会被记录下来,继续运行,填满磁盘,继续运行,锁定机器,继续运行,直到他们最终进入无限循环。玩得开心调试。

于 2013-01-31T18:16:58.977 回答
1

如果报告异常是您的唯一目标,您或许可以尝试以下方法

public class Foo
{
  static void Main(string[] args)
  {
     var domain = AppDomain.CurrentDomain;
     domain.FirstChanceException += new EventHandler<FirstChanceExceptionEventArgs>(CurrentDomain_FirstChanceException);
  }

   static void CurrentDomain_FirstChanceException(object sender, FirstChanceExceptionEventArgs args)
    {
       //If you are not putting this inside a try finally block then this would become an infinite recursion.
        try
        {
            var actualException = args.Exception;
            Console.WriteLine(actualException.ToString());
            //Do whatever with actualException

        }
        finally
        {

        }
    }
}
于 2013-01-31T18:31:43.977 回答
0

使用 instanceof 来确定它是什么类型的异常。就像其他人评论的那样,我认为您需要重新考虑您的异常处理策略。

于 2013-01-31T17:42:31.087 回答
0

你真的不需要任何这些:

AppDomain.CurrentDomain.UnhandledException += SomeExceptionHandler;

将处理范围内发生的所有异常AppDomain(如果您不处理多个AppDomains.

然后,不要尝试以强类型的方式(例如强制转换为"System.XXXXExceptionor "System.YYYYException")获取异常类型,而是使用反射来获取异常对象的整个对象图,然后您可以记录它(或执行任何您想要的错误报告) .

于 2013-01-31T18:24:16.443 回答
0

在@Soundarajan 之后,我将答案实现为:

    static string catch_processing ( Exception  e )
        {
        StringBuilder   sb = new StringBuilder ( );

        try 
            { 
            throw e; 
            } 
        catch ( PathTooLongException )
            {
            sb.Append (
                "Supplied path is longer than the system-" +
                "defined maximum length" );
            }
        catch ( ArgumentException )
            {
            sb.Append (
                "Supplied path contains invalid characters, " +
                "is empty, or contains only white spaces" );
            }
        catch ( UnauthorizedAccessException )
            {
            sb.Append (
                "The caller does not have the " +
                "required permission" );
            }
        : other catch blocks

        sb.AppendFormat ( "{0}{1}{2}{3}",
                          Environment.NewLine,
                          e.Message,
                          Environment.NewLine,
                          e.StackTrace );

        return ( sb.ToString ( ) );
        }
于 2013-01-31T19:13:09.257 回答