是处理异常的好方法。即使用Try Block什么时候可以实际处理异常并从中恢复?

问题描述 投票:0回答:2

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

以下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" }));

}
c# .net exception syntax
2个回答
2
投票

简短的回答:否

A try-catch结构在资源上非常昂贵。从设计的角度来看,这也是错误的。一个例外应该是:exception-异常,可能是错误。您在这里使用它的方式只是检查要使用的两种有效格式中的哪一种。

本质上,您在这里所做的是将异常处理用作计算量大的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 }));

注:这是假设您有合理的把握,可以相信输入将采用两种格式之一。您可能需要添加更多验证,尤其是如果date字段是最终用户可以自由操作的内容。


1
投票

@ Kjartan所说的加上以下内容。

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

以下是我可以考虑的一些选项,各有利弊:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.