系统.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();
这只是意味着它找不到任何与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();
}
}
这样,只有当它不能完成第一部分时才会抛出错误。