如何在try catch块中自动覆盖方法

时间:2017-08-24 20:11:15

标签: c# try-catch

假设我们有类似的东西:

public CustomType DoSomething1() {
   CustomType ct = new CustomType();
   try {
      // do something
   }
   catch(Exception e) {
      ct.Passed = false;
   }
   return ct;
}

public CustomType DoSomething2() {
   CustomType ct = new CustomType();
   try {
      // do something
   }
   catch(Exception e) {
      ct.Passed = false;
   }
   return ct;
}

public CustomType DoSomething3() {
   CustomType ct = new CustomType();
   try {
      // do something
   }
   catch(Exception e) {
      ct.Passed = false;
   }
   return ct;
}

这些方法由另一个使用反射的程序执行,如果CustomType属性Passed == false,程序停止执行另一个。这是由于架构方面的原因。

是否有可能创建一些属性或类似的东西以避免使用try catch,因此如果在方法中抛出异常,它会将Passed属性设置为false并返回到程序? E.g。

[CatchException('Passed', false)]
public CustomType DoSomething1() {
   CustomType ct = new CustomType();
   // do something
   return ct;
}

如果正在做某事'错误将被抛出ct.Passed将等于' false'

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

public static T SafeProcessing<T>(Action<T> action, Action<T> onFail)
    where T: new()
{
     var t = new T();

     try
     {
         a(t);
     }
     catch (Exception e)
     {
          //Log e
          onFail(t);
     }

     return t;
 }

不,你不会这样使用它:

return SafeProcessing(c => DoSomething(c), c => c.Safe = false);

答案 1 :(得分:0)

如果我理解你的问题是正确的,你想避免重复try-catch-block。你可以通过创建一个传递你想要处理的逻辑的函数来解决这个问题。

public static CustomType CatchException(Action a)
{
    CustomType ct = new CustomType();
    try
    {
        a();
    }
    catch
    {
        ct.Passed = false;
    }
    return ct;
}

现在你可以用一种非常舒适的方式多次调用你需要的任何逻辑函数。

public CustomType DoSomething1()
{
    return CatchException(() =>
    {
        //Do something
    });
}
...