Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 系统异常:类型为'的异常;系统异常';被抛出_C# - Fatal编程技术网

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你正在检查foreach
if(abilityScore.Min=score)return abilityScore中的内容如果其tru然后函数返回,但如果不是真的,则执行其余的函数代码,因此在foreach之后有一行抛出异常,然后执行并抛出异常,这不是好的做法,if条件似乎总是false,所以函数不会返回并抛出异常行executed我用你的代码替换了我的代码,但是我得到了这个错误'DeadPool.PerfectionManager.GetAbilityScore(DeadPool.Abiliti‌​esSort,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...
}