下面的代码会报错
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/