我有一个方法,它有一个try catch子句,在那里我解析一个移动的号码。如果解析正常,try之外的代码继续执行。如果解析遇到错误,我输入catch并引发错误。
这一切都很好,直到我收到一个请求,检查另一个电话号码。
我不知道如何做到这一点,因为在后面的代码我需要至少一个正确的电话号码(这并不重要)。
如果我把两个解析都放在一个try中,如果第一个是错的,第二个是好的,我就会有问题,因为无论如何都会引发异常。
try {
model.mobilePhone = PhoneParser.Parse(m.mobile);
model.alternativePhoneNumber = PhoneParser.Parse(m.alternativePhoneNumber);
}
catch (Exception) {
_log.LogWarning("Error while parsing the phone number")
}
return model;
像这样的?试试在接球的时候?
try {
model.mobilePhone = PhoneParser.Parse(m.mobile);
}
catch (Exception) {
try {
model.alternativePhoneNumber = PhoneParser.Parse(m.alternativePhoneNumber);
}
catch (Exception) {
_log.LogWarning("Error while parsing the alternative phone number")
}
_log.LogWarning("Error while parsing the mobile phone number")
}
return model;
3条答案
按热度按时间s4n0splo1#
我建议不要筑巢试捕。
对每个字段使用两个单独的try-catch(
model.PhoneNumber
和model.AlternativePhoneNumber
)。虽然解决这个问题的最好方法是为电话号码创建一个单独的
.TryParse()
扩展方法并使用它。这也会使您的代码符合DRY(不要重复自己)原则。bvk5enib2#
如果您所需要的只是一个有效的电话号码,那么在您的模型中创建一个名为
EnsureValidState
的小助手方法在所有属性都设置好并进行相应的验证后,调用这个方法。你甚至可以将其抽象为实体的抽象基类:
如果你想更进一步,看看https://github.com/PacktPublishing/Hands-On-Domain-Driven-Design-with-.NET-Core/blob/086cabf75211daa8df9d2117dec0181a0339749d/Marketplace.Framework/Entity.cs上的Hands on DDD示例代码,它会给予你知道如何实现一种更通用的方法来确保实体和模型的一致更新。
mbjcgjjk3#
最简单的答案是有两个独立的
try/catch
块。否则,只有在主电话号码失败时才会添加备用电话号码(但很可能如果它们提供了两个,则两个都有效)。正如其他人所建议的,实现
TryParse
可能会有所帮助,但这样会丢失当前正在记录的异常信息。此外,TryParse
不应该将对Parse
的调用 Package 在try/catch
块中,因为异常处理的开销很大。相反,它应该使用与Parse
方法相同的逻辑,但是返回false
而不是抛出异常。