我有一个包含多个方法的类,并希望为它们提供一个异常处理程序。 这些方法有很多,它们有不同的参数,为每个方法编写try / catch都会很难看。
你是否知道我可以通过一个一个类的异常处理程序来完成它,这将处理它们。
更新
你们许多人问我为什么。原因是我用各种方法调用数据源。 所以我的类有函数getData1,gedData2,getData3,getData4,....,getDataN。问题是无法检查连接是否仍处于打开状态,并且创建新连接非常昂贵。所以我试图重用连接,如果下次调用的连接失败,我会抓住这个并重新连接并再试一次。这就是为什么我需要这个try / catch所有块。
为所有功能执行此操作:
try{
datasource.getData()
}
catch(ConnectionException)
{
datasource.Connect();
datasource.getData()
}
由于
答案 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,虽然我认为这是对异常处理的严重误用,除非你想附加一个记录器或某事。