系统.System.Exception'被扔出来

本文关键字:System Exception 系统 | 更新日期: 2023-09-27 18:03:28

我在这个代码中得到这个错误

  public static AbilityScore GetAbilityScore(AbilitiesSort abilitySort, int score)
    {
        var abilityScores = AbilitiesScore[abilitySort];
        foreach (var abilityScore in abilityScores)
            if (abilityScore.Min <= score && abilityScore.Max >= score)
                return abilityScore;
       throw new System.Exception();   // error in this line
    }

我在这一行得到错误throw new System.Exception();

系统.System.Exception'被扔出来

这只是意味着它找不到任何与score匹配的abilityScore。

所以,它执行

throw new System.Exception();

你需要考虑如何处理这种情况。要么抛出一个异常并在调用GetAbilityScore时捕获它,要么返回null(假设AbilityScore是引用类型)。

如果你坚持使用Exception策略,不要抛出System.Exception。而是从System.Exception中派生自定义异常。请阅读选择正确的异常类型来抛出

执行完代码的其他部分后,您总是抛出异常,似乎当您的if条件if (abilityScore.Min <= score && abilityScore.Max >= score)foreach函数中不返回并执行throw new System.Exception();时抛出异常,因此检查如果条件是否总是false或否。同样在foreach语句中你返回的是if条件,而不是else所以也要返回else条件

,你可以把你的代码包装在try catch块中所以当异常发生时抛出异常在其他情况下不是

try 
{
    var abilityScores = AbilitiesScore[abilitySort];
    foreach (var abilityScore in abilityScores)
    {
        if (abilityScore.Min <= score && abilityScore.Max >= score)
        {
            return abilityScore;
        }
        else
        {
           return null
        }
   }
}
catch 
{
   throw new System.Exception();
   return null;
}

或者你可以返回null而不抛出任何异常

try 
{
    var abilityScores = AbilitiesScore[abilitySort];
    foreach (var abilityScore in abilityScores)
    {
        if (abilityScore.Min <= score && abilityScore.Max >= score)
        {
            return abilityScore;
        }
        else
        {
           return null
        }
   }
}
catch 
{
   return null;
}

不幸的是,Mostafiz的答案在第一次未能找到正确的abilityScore后爆发,如果列表中的第一个项目不匹配则返回null。为了避免这种情况,您可以根据最适合您的方法尝试以下任何方法。

1。使用null传播和linq

    // Use this if you're using C# 6.0
    public static AbilityScore GetAbilityScore(AbilitiesSort abilitySort, int score)
    {            
        return AbilitiesScore[abilitySort]?.FirstOrDefault(s => s.Min <= score && s.Max >= score);
    }

2。仅使用Linq

    // otherwise you can try this
    public static AbilityScore GetAbilityScore(AbilitiesSort abilitySort, int score)
    {
        var scores = AbilitiesScore[abilitySort];
        if (scores == null) throw new NullReferenceException("Target ability scores could not be found.");
        return scores.FirstOrDefault(s => s.Min <= score && s.Max >= score);
    }

3。Non-linq

    // And lastly, if linq does not work for you
    public static AbilityScore GetAbilityScore(AbilitiesSort abilitySort, int score)
    {
        var scores = AbilitiesScore[abilitySort];
        if (scores == null) throw new NullReferenceException("Target ability scores could not be found.");
        foreach (var abilityScore in scores)
            if (abilityScore.Min <= score && abilityScore.Max >= score)
                return abilityScore;
        return null;
    }

最后,我仍然建议您对使用该方法返回的AbilityScore进行空检查

var myAbilityScore = className.GetAbilityScore(abilitySort, score);
if (myAbilityScore != null) {
    // code goes here...
}

也许这就是你应该做的。目前,它总是抛出一个异常,而它应该只在出现问题时显示异常。

 public static AbilityScore GetAbilityScore(AbilitiesSort abilitySort, int score)
{
   try {
    var abilityScores = AbilitiesScore[abilitySort];
    foreach (var abilityScore in abilityScores)
        if (abilityScore.Min <= score && abilityScore.Max >= score)
            return abilityScore;
   }
   catch {
   throw new System.Exception();   
   }
}

这样,只有当它不能完成第一部分时才会抛出错误。