当我被迫编写无法访问的代码时,我该怎么办

本文关键字:代码 我该怎么办 访问 被迫 | 更新日期: 2023-09-27 18:17:10

我有一段简单的代码:

public static int GetInt(int number)
{
    int[] ints = new int[]{ 3, 7, 9, int.MaxValue };
    foreach (int i in ints)
        if (number <= i)
            return i;
    return int.MaxValue; //this should be unreachable code since the last int is int.MaxValue and number <= int.MaxValue is allways true so the above code will allways return
}

问题是编译器说并非每个执行路径都返回一个值。所以我必须编写永远无法到达的代码。我的问题是,在这种情况下我该怎么办?我应该返回一些默认值还是应该抛出异常。另外,如果我想抛出异常,什么异常适合抛出?我没有找到类似UnreachableCodeException的东西.

当我被迫编写无法访问的代码时,我该怎么办

我很想使用InvalidOperationException - 或者一些你不会明确捕获的其他异常。给它一条消息,表明你真的没想到会到达这里。这是一场"世界严重破碎"的失败。 InvalidOperationException并没有完全捕捉到这一点,但我想不出更好的方法。当然,您始终可以创建自己的异常以在整个代码库中使用。

不要只返回一个值,否则你永远不会发现你的世界是否颠倒了。

使用以下命令在foreach后显示逻辑失败消息:

System.Diagnostics.Debug.Fail("Unreachable code reached");

这将在调试期间提醒您。

此外,在生产过程中还抛出异常:

throw new InvalidOperationException();

不要只返回一个值,尤其是一个可能有效的值:你永远不会发现逻辑错误。

.NET

7 为此目的引入了新的 UnreachableException 类,正如我刚刚通过观看 YouTube 视频 Nick Chapsas 永远不应该抛出的新 .NET 异常所了解的那样。

throw new UnreachableException();

我认为每种情况都不同,但是是的,最终您必须返回一些内容或抛出异常。在代码示例中处理此问题的方法只是删除 int。数组中的最大值:

public static int GetInt(int number)
{
    int[] ints = new int[]{ 3, 7, 9 };
    foreach (int i in ints)
        if (number <= i)
            return i;
    return int.MaxValue;
}

与其从循环返回,不如声明一个返回值变量,设置它,然后在代码末尾返回一次。

public static int GetInt(int number)
{
    var rtnVal = int.MaxValue;
    int[] ints = new int[]{ 3, 7, 9, int.MaxValue };
    foreach (int i in ints) {
        if (number <= i) {
            rtnVal = i;
            break;
        }
    }
    return rtnVal;
}

下面是一个 LINQ 选项,当找不到匹配项时,它会自动引发异常

public static int GetInt(int number)
{
    int[] ints = new int[]{ 3, 7, 9, int.MaxValue };
    return ints.First(i => number <= i);
}

编译器无法判断 foreach 循环将始终返回一个值。

理论编译器可以这样做,因为原则上信息可用,但 C# 编译器不能。

为什么不只返回大于数字的第一个值

    public static int GetInt(int number)
    {
        var ints = new[] { 3, 7, 9};
        return (ints.Any(i => i > number))? 
            ints.First(i => i > number): int.MaxValue;
    }