asp.net 如何在需要检查两件事的地方编写try catch语句

lyr7nygr  于 2023-03-31  发布在  .NET
关注(0)|答案(3)|浏览(95)

我有一个方法,它有一个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;
s4n0splo

s4n0splo1#

我建议不要筑巢试捕。
对每个字段使用两个单独的try-catch(model.PhoneNumbermodel.AlternativePhoneNumber)。
虽然解决这个问题的最好方法是为电话号码创建一个单独的.TryParse()扩展方法并使用它。这也会使您的代码符合DRY(不要重复自己)原则。

bvk5enib

bvk5enib2#

如果您所需要的只是一个有效的电话号码,那么在您的模型中创建一个名为EnsureValidState的小助手方法

public void EnsureValidState()
{
   if(this.mobilePhone == null && this.alternativePhoneNumber ==null) 
   {
     //no valid state, raise exception
   }
    
    //other validation for different rules.
}

在所有属性都设置好并进行相应的验证后,调用这个方法。你甚至可以将其抽象为实体的抽象基类:

public abstract class BaseEntity
{
   private abstract void EnsureValidState();
}

如果你想更进一步,看看https://github.com/PacktPublishing/Hands-On-Domain-Driven-Design-with-.NET-Core/blob/086cabf75211daa8df9d2117dec0181a0339749d/Marketplace.Framework/Entity.cs上的Hands on DDD示例代码,它会给予你知道如何实现一种更通用的方法来确保实体和模型的一致更新。

mbjcgjjk

mbjcgjjk3#

最简单的答案是有两个独立的try/catch块。否则,只有在主电话号码失败时才会添加备用电话号码(但很可能如果它们提供了两个,则两个都有效)。

try 
{
    model.mobilePhone = PhoneParser.Parse(m.mobile);
}
catch (Exception e)
{
    _log.LogWarning($"Error while parsing the mobile phone number:\r\n{e}")
}

try 
{
    model.alternativePhoneNumber = PhoneParser.Parse(m.alternativePhoneNumber);
}
catch (Exception e) 
{
    _log.LogWarning($"Error while parsing the alternative phone number:\r\n{e}")
}

return model;

正如其他人所建议的,实现TryParse可能会有所帮助,但这样会丢失当前正在记录的异常信息。此外,TryParse不应该将对Parse的调用 Package 在try/catch块中,因为异常处理的开销很大。相反,它应该使用与Parse方法相同的逻辑,但是返回false而不是抛出异常。

相关问题