用一种方法收集渔获处理

本文关键字:处理 方法 一种 | 更新日期: 2023-09-27 17:56:47

.Net Framework 版本:3.5

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

string catch_processing ( Exception  e )
    {
    }

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

switch ( e )
    {
    case PathTooLongException:
        :
        break;
    case DirectoryNotFoundException:
        :
        break;
    default:
        :
        break;
    }

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

用一种方法收集渔获处理

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

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

一个TryCatchLog静态方法被发布到 CodeReview 中,它执行我认为您正在尝试做的事情; exceptionSubscriber.TryCatchLog(Statements...)会捕获Statements...抛出的任何异常,将它们记录到exceptionSubscriber,然后重新抛出。

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

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

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

你真的不需要这些:

AppDomain.CurrentDomain.UnhandledException += SomeExceptionHandler;

将处理AppDomain范围内发生的任何和所有异常(如果您不处理多个AppDomain,则基本上是整个应用程序。

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

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