C# 系统异常:类型为'的异常;系统异常';被抛出
我在这个代码中得到了这个错误C# 系统异常:类型为'的异常;系统异常';被抛出,c#,C#,我在这个代码中得到了这个错误 public static AbilityScore GetAbilityScore(AbilitiesSort abilitySort, int score) { var abilityScores = AbilitiesScore[abilitySort]; foreach (var abilityScore in abilityScores) if (abilityScore.Min <
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
}
公共静态能力核心GetAbilityScore(能力排序能力排序,整数分数)
{
var能力核心=能力核心[能力排序];
foreach(能力核心中的var能力核心)
if(abilityScore.Min=分数)
返回能力核心;
抛出新System.Exception();//此行出错
}
我在这一行中遇到错误
抛出新系统.Exception()代码>在执行完代码的其他部分后,您总是抛出异常,这似乎是当您的if条件if(abilityScore.Min=score)
在foreach
函数中失败时,函数没有返回并执行抛出新系统。异常()代码>它抛出异常,所以检查条件是否总是false。同样,在你的foreach中,你返回的是if条件,而不是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;
}
试试看
{
var能力核心=能力核心[能力排序];
foreach(能力核心中的var能力核心)
{
if(abilityScore.Min=分数)
{
返回能力核心;
}
其他的
{
返回空
}
}
}
抓住
{
抛出新的System.Exception();
返回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;
}
试试看
{
var能力核心=能力核心[能力排序];
foreach(能力核心中的var能力核心)
{
if(abilityScore.Min=分数)
{
返回能力核心;
}
其他的
{
返回空
}
}
}
抓住
{
返回null;
}
也许这就是你应该做的。目前,它总是抛出一个异常,当它只应该在出现错误时显示一个异常
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();
}
}
公共静态能力核心GetAbilityScore(能力排序能力排序,整数分数)
{
试一试{
var能力核心=能力核心[能力排序];
foreach(能力核心中的var能力核心)
if(abilityScore.Min=分数)
返回能力核心;
}
抓住{
抛出新的System.Exception();
}
}
这样,只有当它不能完成第一部分时才会抛出错误。这意味着它找不到任何与分数匹配的能力核心
所以,它执行
throw new System.Exception();
你需要考虑如何处理这个案子。调用GetAbilityScore时引发异常并捕获它,或者返回null(假设AbilityScore是引用类型)
如果您坚持异常策略,请不要抛出System.Exception
。
从系统派生自定义异常。改为从系统派生自定义异常。
请阅读Mostafiz,不幸的是,在首次未能找到正确的abilityScore后,答案突然出现,如果列表中的第一项不匹配,则返回null。为了避免这种情况,您可以根据最适合您的方式尝试以下任何一种方法
1.使用空传播和linq
你的意思是改变foreach吗?@KareemNabil你正在检查foreachif(abilityScore.Min=score)return abilityScore中的内容代码>如果其tru然后函数返回,但如果不是真的,则执行其余的函数代码,因此在foreach之后有一行抛出异常,然后执行并抛出异常,这不是好的做法,if条件似乎总是false,所以函数不会返回并抛出异常行executed我用你的代码替换了我的代码,但是我得到了这个错误'DeadPool.PerfectionManager.GetAbilityScore(DeadPool.AbilitiesSort,int)“:并非所有代码路径都返回一个值‘我尝试了你的两个代码,但仍然得到相同的错误’我尝试了你的三个代码,但仍然得到相同的错误抛出异常=错误。您一定是C#新手,因此不了解基本语法。读一下例外情况,伙计。你显然是复制粘贴了这个,所以因为我们无法真正知道你在做什么,我们无法通过阅读你的代码提供一个好的解决方案。我可以告诉你,如果没有找到有效的能力分数(介于最大值和最小值之间),就会抛出一个异常。该异常应该存在。当我尝试捕获exception i时,出现错误“DeadPool.PerfectionManager.GetAbilityScore(DeadPool.AbilitiesSort,int)”:并非所有代码路径都返回值“您能告诉我如何修复此错误吗?”@MichaelThePotatoof当然你明白了。原因是必须从该方法返回某些内容。FE循环在某些条件下返回一个值,如果这些条件都不满足,将抛出异常。捕获它将导致该方法不返回任何值或不抛出异常作为退出。异常被认为是一种返回值,因为它们提供了方法的退出点。简而言之,您提供的代码似乎是正确的,没有任何明显的缺陷。发送到方法中的数据不在有效的AbilityScore范围内。您需要检查原因。我用您的代码替换了我的代码,但出现了以下错误“DeadPool.PerfectionManager.GetAbilityScore(DeadPool.AbilitiesSort,int)”:并非所有代码路径都返回值“我理解您的意思,但我不编码代码的用途。”it@KareemNabil:“但我不编码”--那么堆栈溢出对您来说是错误的位置。它说:“Stack Overflow是一个面向专业和热心程序员的问答网站”。你不必是专业人士,但你必须是某种程序员。有一种对编程的基本能力的期望,根据您自己的陈述,您似乎不具备这种能力。
// 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);
}
// 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);
}
// 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;
}
var myAbilityScore = className.GetAbilityScore(abilitySort, score);
if (myAbilityScore != null) {
// code goes here...
}