使用try/catch/finally执行常规类?

5 c# aop exception-handling

在我的代码中,我发现自己有很多不同的方法:

try
{
  runABunchOfMethods();
}
catch (Exception ex)
{
  logger.Log(ex);
}
Run Code Online (Sandbox Code Playgroud)

怎么样创造这个:

public static class Executor
{

    private static ILogger logger;

    public delegate void ExecuteThis();

    static Executor()
    {
        // logger = ...GetLoggerFromIoC();
    }

    public static void Execute<T>(ExecuteThis executeThis)
        where T : Exception
    {
        try
        {
            executeThis();
        }
        catch (T ex)
        {
            // Some kind of Exception Handling Strategy...
            logger.Log(ex);
            // throw;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

只是像这样使用它:

private void RunSomething()
{
  Method1(someClassVar);
  Method2(someOtherClassVar);
}
Run Code Online (Sandbox Code Playgroud)

...

Executor.Execute<ApplicationException>(RunSomething);
Run Code Online (Sandbox Code Playgroud)

这种方法有什么缺点吗?(您可以在需要finally时添加Executor方法和委托,并使用泛型来处理要捕获的Exeception类型...)

编辑:很抱歉不清楚 - 我真正想到的是关于尝试将代码的执行从有问题的类移动到更广泛的类来执行此操作的一般想法的一些输入.我只是快速模拟了一个解决方案,但在现实生活中,您自然会使用诸如异常处理策略,抽象执行基类以及针对特定层/系统部分的更专业执行类的事情.我通常使用try .../runABunchOfMethods-part创建一个方法(这会执行异常处理,具有特殊的异常),调用runABunchOfMethods,而runABunchOfMethods又执行一组有限的其他方法"clean code"样式.

我会在某些层面上购买混淆论证,但如果整个解决方案/架构采用这种提议的方法,新的程序员应该能够理解这种模式.

我编辑了Executor以包含一个通用T,允许调用代码指定exeception以显示如何处理专门的exeception.在其他情况下,你可能会有很多问题:es取决于你想要做什么,但这些是我所讨论的具体子类中的特殊情况.

tan*_*ius 12

缩减是您的一般异常处理方法.Exception没有充分理由你不应该抓住基类.它可以隐藏各种问题; 好吧,你记录它们,但你的代码不知道它只是内存不足,或者文件不存在并继续,好像根本没有问题.
您在此处描述的方法将鼓励一般的异常处理.

相关:
捕获一般异常真的很糟糕吗?
捕获System.Exception等非特定异常是不好的做法?为什么?

编辑(对OP的编辑和澄清的回应):
我不确定你想要实现什么.Basicall你隐藏一个异常(一般或指定 - 它只是被吞下).打电话给你的方法Executor.Hide<ApplicationException>( RunSomething );很清楚这里发生了什么.但吞咽异常有什么好处吗?我不这么认为.同样,有些地方你需要这个 - 但它们很少见,应该有意选择.您提供的方法鼓励在不考虑的情况下吞下异常.
您注释掉了重新抛出线(throw ex或者更好,只throw保留了堆栈).你启用这条线怎么办?基本上只是记录.你捕获一个异常,记录它并重新抛出它......再次捕获它?你为什么不把你的伐木记录到后一个地方?
当你能够处理它时,尝试仅捕获异常.那里你也可以登录.任何好的记录器都能显示堆栈跟踪,这样您就不会丢失任何信息.

相关:
哪里可以试试catch?


Dav*_*001 1

如果你想保持对象干净,你可以考虑使用 AOP 框架,比如PostSharp。然后,如果您愿意,您的异常记录(例如)可以在一个地方处理。

编辑:

可以使用 postsharp 删除 try / catch 块 - 以下是可以在 PostSharp 中创建的常见异常处理程序示例:

[Serializable]
public class CommonExceptionHandling : OnExceptionAspect
{
    public override void OnException(MethodExecutionEventArgs eventArgs)
    {
        // can do some logging here
        // ...

        // throw the exception (out of postsharp) to where it occurred:
        eventArgs.FlowBehavior = FlowBehavior.RethrowException;                       

        // If you want to ignore the exception, you can do this:
        //eventArgs.FlowBehavior = FlowBehavior.Return;

        base.OnException(eventArgs);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果将此属性应用于类,则该类中的任何方法引发的任何异常都将通过上述代码进行引导。