这是处理异常的好方法吗? 即使用 Try Block 当您实际上可以处理异常并从中恢复时?



用户可以使用/-作为分隔符以格式输入日期。

以下try块适用于/-失败,反之亦然:

Try
{
caseData.AddRange(
JsonConvert.DeserializeObject<List<CaseInfo>>(
jObject["caseData"].ToString(), 
new JsonSerializerSettings { DateFormatString = "d/M/yyyy" }));
}
Catch(Exception)
{
caseData.AddRange(
JsonConvert.DeserializeObject<List<CaseInfo>>(
jObject["caseData"].ToString(), 
new JsonSerializerSettings  { DateFormatString = "d-M-yyyy" }));
}

简短回答:不。

就资源而言,try-catch结构非常昂贵。从设计的角度来看,这也感觉不对;一个例外应该是:一个例外- 一些不寻常的东西,可能是一个错误。您在此处使用它的方式只是检查使用两种有效格式中的哪一种。

实质上,您在这里所做的是将异常处理用作计算成本高昂的if-else操作。

更好的解决方案可能是首先尝试提取jObject["caseData"]的内容,并显式检查其格式以了解要使用哪个选项。知道这一点后,可以使用常规if-else结构来决定如何反序列化它。

像这样:

var dateText = jObject["caseData"].ToString();
var matchingFormat = dateText.Contains("/") ? "d/M/yyyy" : "d-M-yyyy";
caseData.AddRange(
JsonConvert.DeserializeObject<List<CaseInfo>>(
jObject["caseData"].ToString(), 
new JsonSerializerSettings  { DateFormatString = matchingFormat }));

注意:这假设您有理由确定可以信任输入将采用两种格式之一。您可能希望添加更多验证,尤其是当日期字段是最终用户可以自由操作的内容时。

@Kjartan说了什么加上以下内容。

如果您有多个日期字段,并且用户以不同的格式输入多个日期,则DateFormatString解决方案可能无法正常工作。

以下是我可以考虑的一些选项,它们都有优点和缺点:

  1. 每个日期都有单独的年、月和日字段;
  2. 使 API 仅接受给定格式的日期,并使源 json 的提供者处理此问题;
  3. 预解析源数据并格式化所有日期;
  4. 将日期CaseInfo存储为字符串,并提供进行转换的访问器;
  5. 创建一个自定义JsonConverter,可能基于 DateTimeConverterBase,并用[JsonConverter(typeof(MyResilientDataFormatJsonConverter))]标记有问题的属性。

一般说明:如果您支持多种格式和/或区域性,则解析日期会很快变得困难。例如:今天是 10/09/2019 还是 09/10/2019?

最新更新