c# - 为什么 return 语句必须在 catch block 中的 throw 语句之前

标签 c# computer-science

下面的代码会报错

try
{
    session.Save(obj);
    return true;
}
catch (Exception e)
{
    throw e;
    return false;  // this will be flagged as unreachable code
}

而这不会:

try
{
    session.Save(obj);
    return true;
}
catch (Exception e)
{
    return false;
    throw e;
}

我不明白...我以为我的 csc101 告诉我 return 语句应该始终是函数中的最后一个语句并且它退出函数并将控制权返回给调用代码。为什么这违背了我教授的逻辑,为什么其中只有一个会产生警告?

最佳答案

return 将退出该方法; throw 退出该方法,假设它不在 try 中。它只能退出一次!

因此,无论顺序如何 - throw/return 中的第一个有效地结束了该方法。

不过,作为更一般的反馈:如果意图是在失败时返回 false,那么您只需要:

try
{
    session.Save(obj);
    return true;
}
catch
{
    return false;
}

就我个人而言,我会说这是糟糕的代码 - 它向调用者隐藏了实际问题,使得调试变得非常困难。它没有告诉我们它失败的原因。我会说更好的方法是简单地让异常冒泡。在那种情况下,返回 true 是没有意义的,因为我们永远不会返回 false - 捕获异常只是为了重新抛出它是没有意义的。所以整个方法就变成了:

session.Save(obj);

(没有其他要求)


如果您的问题是“为什么只有其中一个生成警告”:这是一个公平的问题,但编译器不是需要来识别它们中的任一个你。也许它应该发现它。我怀疑 gmcs 发现这一点并发出警告 - mono 中的编译器更愿意指出愚蠢。


编辑:正如预期的那样,[g]mcs 输出:

Program.cs(15,13): warning CS0162: Unreachable code detected

Program.cs(28,13): warning CS0162: Unreachable code detected

对于下面的代码 - 所以它确实将两种用途都报告为警告:

class Program
{
    static void Main() { }
    static void DoSomething() { }
    bool ReturnFirst()
    {
        try
        {
            DoSomething();
            return true;
        }
        catch
        {
            return false;
            throw; // line 15
        }
    }
    bool ThrowFirst()
    {
        try
        {
            DoSomething();
            return true;
        }
        catch
        {
            throw;
            return false; // line 28
        }
    }
}

关于c# - 为什么 return 语句必须在 catch block 中的 throw 语句之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28055047/

相关文章:

c# - Java 中 Iterator 的 C# 等价物是什么

c# - .NET Core 2 DLL 引用与 C++ 代码运行时错误

c# - 使用 p/invoke (Silverlight) 从注册表中获取字符串值

algorithm - 给定一个字符串列表,打印所有字符串组合,从每个字符串中选择一个字符

c# - 如何使用合约解析器和值提供者在反序列化过程中自定义值设置

java - 为什么Java和C#不允许在栈上创建对象?

c++ - 数字的二进制表示的大小

functional-programming - 什么是 Y 组合器?

javascript - 如何编写 100% 纯记忆化功能?

c# - CA1009 : Declare event handlers correctly?