一个异常处理程序,用于CLASS的所有异常

时间:2009-08-03 11:23:53

标签: c# exception

我有一个包含多个方法的类,并希望为它们提供一个异常处理程序。 这些方法有很多,它们有不同的参数,为每个方法编写try / catch都会很难看。

你是否知道我可以通过一个一个类的异常处理程序来完成它,这将处理它们。

更新


你们许多人问我为什么。原因是我用各种方法调用数据源。 所以我的类有函数getData1,gedData2,getData3,getData4,....,getDataN。问题是无法检查连接是否仍处于打开状态,并且创建新连接非常昂贵。所以我试图重用连接,如果下次调用的连接失败,我会抓住这个并重新连接并再试一次。这就是为什么我需要这个try / catch所有块。

为所有功能执行此操作:

try{    
   datasource.getData()
}
catch(ConnectionException)
{
   datasource.Connect();
   datasource.getData()
}

由于

6 个答案:

答案 0 :(得分:22)

您可以使用委托将方法的代码传递到单个try catch中,如下例所示:

    private void GlobalTryCatch(Action action)
    {
        try
        {
            action.Invoke();
        }
        catch (ExpectedException1 e)
        {
            throw MyCustomException("Something bad happened", e);
        }
        catch (ExpectedException2 e)
        {
            throw MyCustomException("Something really bad happened", e);
        }
    }

    public void DoSomething()
    {
        GlobalTryCatch(() =>
        {
            // Method code goes here
        });
    }

答案 1 :(得分:13)

我无法弄清楚为什么你可以使用单一方法处理类中的所有异常,从中获益(你能详细解释一下吗?我很好奇......)

无论如何,您可以使用AOP(面向方面​​编程)技术在类的方法周围注入(静态或运行时)异常处理代码。

有一个名为PostSharp的好的汇编后处理库,您可以使用类中方法的属性进行配置:

您可以定义这样的方面(来自PostSharp网站):

public class ExceptionDialogAttribute : OnExceptionAspect
{
    public override void OnException(MethodExecutionEventArgs eventArgs)
    {
        string message = eventArgs.Exception.Message;
        MessageBox.Show(message, "Exception");
        eventArgs.FlowBehavior = FlowBehavior.Continue;
    }
}

然后,您将该属性应用于要监视异常的方法,  像这样:

public class YourClass {

    // ...

    [ExceptionDialog]
    public string DoSomething(int param) {
        // ...
    }
}

您也可以将该属性应用于整个类,如下所示:

[ExceptionDialog]
public class YourClass {
    // ...
    public string DoSomething(int param) {
        // ...
    }
    public string DoSomethingElse(int param) {
        // ...
    }
}

这会将建议(异常处理代码)应用于类中的每个方法。

答案 2 :(得分:1)

我认为没有。您可以将try / catch移动到调用者,但这不是很好的设计。将它分成另一个类可能更好,并使用Reflection来调用方法,如下所示:

public class MyClass {}
public class MySafeClass {
    public void CallMethod(string name, object[] param) {
        Type t = typeof(MyClass);
        MyClass mc = new MyClass();
        try {
            t.GetMethod(name).Invoke(mc, param);
        }
        catch {
            //...;
        }
    }

}

但你不应该!这不是很好的做法。

另一种方法仍在使用try/catch,但只有一种方法可以将异常等等返回给用户:

public class MyClass {
    void DoException(string message) {
        throw new Exception(message);
    }
}

不是一个好选择。

我不明白为什么它会变得丑陋 - 即使你只是用一条消息将整个方法包装在一个try / catch中。这可能是可行的。

离开它们并将它们传递给调用者也是一个更好的选择,可能在try/finally

尝试/捕获所有内容并不是很难,特别是使用Visual Studio和SharpDevelop中的代码段。

答案 3 :(得分:1)

这听起来像你的设计有问题。你能详细说明你想要捕获的异常以及为什么我们可以尝试帮助它。

答案 4 :(得分:1)

异常与类无关,但面向方法/调用堆栈。通常,对象不应尝试处理自己的方法中的异常。这取决于这些方法的调用者。

答案 5 :(得分:0)

你可能想对你的main方法进行try / catch,虽然我认为这是对异常处理的严重误用,除非你想附加一个记录器或某事。