如何编写满足双手机号解析校验需求的try-catch语句
如何编写满足双手机号解析校验需求的try-catch语句
我完全懂你的痛点——现在要处理两个手机号的解析,既要保证至少有一个能成功解析(满足后续代码的要求),还得分别记录对应的错误日志,之前的两种写法确实都有问题:
第一种把两个解析塞在同一个try里,只要第一个失败就直接跳去catch了,哪怕第二个手机号是完全合法的,也没机会被解析,这显然不符合你的需求;第二种嵌套try-catch的逻辑又太绕,而且只有第一个手机号失败时才会尝试第二个,要是第一个成功但第二个其实需要被解析(哪怕失败),这个逻辑也覆盖不到,最后还没做“至少一个有效”的校验。
给你两个更靠谱的方案,按需选就行:
方案一:独立尝试解析,最后校验有效性
把两个手机号的解析操作完全分开,各自处理异常,最后再检查是否至少有一个有效手机号:
// 先初始化字段为null,避免未赋值问题 model.mobilePhone = null; model.alternativePhoneNumber = null; // 尝试解析主手机号 try { model.mobilePhone = PhoneParser.Parse(m.mobile); } catch (Exception) { _log.LogWarning("解析主手机号时出错"); } // 不管主号成功与否,都尝试解析备用手机号 try { model.alternativePhoneNumber = PhoneParser.Parse(m.alternativePhoneNumber); } catch (Exception) { _log.LogWarning("解析备用手机号时出错"); } // 关键步骤:确保至少有一个有效手机号,满足后续代码要求 if (model.mobilePhone == null && model.alternativePhoneNumber == null) { _log.LogError("主手机号和备用手机号解析均失败"); // 这里可以根据业务需求抛出异常,或者返回错误标记 throw new InvalidOperationException("没有可用的有效手机号"); } return model;
这个方案的好处是:两个解析操作完全独立,不会互相影响;错误日志能精准记录哪个手机号出了问题;最后强制校验有效性,避免后续代码拿到两个无效值。
方案二:封装辅助方法,减少重复代码
如果以后可能要扩展更多手机号的解析,建议把解析逻辑封装成一个辅助方法,代码会更简洁易维护:
// 封装的辅助方法:尝试解析手机号,失败返回null并记录对应日志 private PhoneNumber TryParsePhoneNumber(string phoneNumber, string errorLogMessage) { try { return PhoneParser.Parse(phoneNumber); } catch (Exception) { _log.LogWarning(errorLogMessage); return null; } } // 业务逻辑里直接调用辅助方法 model.mobilePhone = TryParsePhoneNumber(m.mobile, "解析主手机号时出错"); model.alternativePhoneNumber = TryParsePhoneNumber(m.alternativePhoneNumber, "解析备用手机号时出错"); // 同样做有效性校验 if (model.mobilePhone == null && model.alternativePhoneNumber == null) { _log.LogError("两个手机号解析都失败了"); throw new InvalidOperationException("无有效手机号可用"); } return model;
这样以后再加第三个、第四个手机号解析,直接调用辅助方法就行,不用重复写try-catch的模板代码,可读性和复用性都更强。
备注:内容来源于stack exchange,提问作者sosNiLa
相关产品推荐
相关产品推荐

