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;
}
}
bool ThrowFirst()
{
try
{
DoSomething();
return true;
}
catch
{
throw;
return false;
}
}
}
throw
语句和return
语句一样,会退出函数。在同一个代码块中,这两个语句之后的任何内容都不会被执行。在您的情况下,您需要使用throw e
或return false
。如果您希望同时使用两者,则需要稍微修改您的函数。 - Michael Aquilina