mutliple try / catch有更高效的语法吗?

时间:2016-06-04 15:02:37

标签: c#

我有一个Facebook正在调用的回调网络方法。不幸的是,使用此单个URL 的调用的目的仅由在Post主体中传递的对象(json)的结构决定。现在,我在考虑:

try { Class1 obj1 = JsonConvert.DeserializeObject<Class1>(rawData); 
      //code to run if data is of Class1 ...
    }
catch
{ try { Class2 obj2 = JsonConvert.DeserializeObject<Class2>(rawData);
        //code to run if data is of Class2 ... 
      }
  catch
      { Class3 obj3 = JsonConvert.DeserializeObject<Class3>(rawData); 
        //code to run if data is of Class3...
      }
}

是否有比上述更清洁的方式?

1 个答案:

答案 0 :(得分:3)

理想情况下,您不应该使用异常来驱动不处理异常情况的代码路径上的决策。如果这是你无法避免的,你可以设置一个尝试不同类的循环,如下所示:

var deserializers = new Func<string,object>[] {
    (rawData) => JsonConvert.DeserializeObject<Class1>(rawData)
,   (rawData) => JsonConvert.DeserializeObject<Class2>(rawData)
,   (rawData) => JsonConvert.DeserializeObject<Class3>(rawData)
};
object result = null;
foreach (var d in deserializers) {
    try {
        result = d(rawData);
        break;
    } catch {
        // Conversion was unsuccessful
    }
}

如果反序列化正常,则会到达break语句,并且您的循环退出。否则,循环继续到下一次迭代,直到循环成功,或者我们用完反序列化器。

注意:为了将仿函数放入数组中,可能需要显式强制转换:

(rawData) => (object)JsonConvert.DeserializeObject<Class1>(rawData)