用一种方法收集渔获处理
本文关键字:处理 方法 一种 | 更新日期: 2023-09-27 17:56:47
.Net Framework 版本:3.5
我有一个程序可以处理可以生成的所有异常。这会导致大量的 catch 块,其中许多是从一种方法到另一种方法的重复项。我想将所有捕获处理收集到一种方法中。例如:
string catch_processing ( Exception e )
{
}
在此示例中,该方法将返回e.Message
和e.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 ( ) );
}