【问题标题】:Why are exceptions always accepted as a return type (when thrown)?为什么总是接受异常作为返回类型(抛出时)?
【发布时间】:2015-11-19 13:50:15
【问题描述】:

为什么总是接受异常作为返回类型(抛出)?

有效示例 1:

  public string foo()
    {
     return "Hello World!";
    }

无效示例(显然):

public string foo()
{
 return 8080;
}

有效示例 2:

public string foo()
{
 throw new NotImplementedException("Hello Stackoveflow!");
}


我可以看到我的“Invalid Example”是“抛出”而不是“返回”异常,但是,我的方法永远不会返回该方法定义的类型。为什么我的编译器允许它编译?

【问题讨论】:

  • 因为它可以告诉我们该方法永远不会正常完成。所以永远不能使用返回值。抱怨没有意义。
  • 编译器只需要验证所有可能的代码路径永远不会到达最后一个右括号。有问题的方法永远不会。干得好。
  • 因为是同线程抛出的。
  • @Carl 线程与它无关。
  • @GlorinOakenfoot 任务将异常返回给调用者线程,同时关闭发出异常的线程。这里没有返回异常消息的地方,所以它只是崩溃了。

标签: c# .net exception exception-handling compilation


【解决方案1】:

异常不是返回类型,异常表示方法中的错误并且无法继续。

你的有效示例2没有返回任何东西,编译器知道它总是会抛出异常,所以它不需要担心返回。

如果你有:

public string foo(int something)
{
  if(something > 10){
    throw new NotImplementedException("Hello Stackoveflow!");
  }
}

它会抱怨,因为你不会一直返回值。

此外,从您的示例来看,如果您的代码中有:string val = something(),则永远不会设置 val,因为异常不是返回值。

但是,它是有效代码,您的函数可以根据其签名返回值或抛出异常。如果有的话,您可能会期望编译器发出警告。我不确定 C#,但在 java 中,如果您的代码被确定为无法访问,您将收到警告,例如:

public string foo(int something)
{
  throw new NotImplementedException("Hello Stackoveflow!");
  return "OK";
}

这段代码会给你一个警告,因为这个方法不可能到达 return 语句(但它仍然是有效的代码,至少如果它是 Java 的话)。

【讨论】:

  • 感谢您的解释。在我看来有什么奇怪的......编译器允许我总是发生错误(强制异常,如示例 2),但不能编译不同的结果类型,因为这会导致错误?
  • @NickProzee 因为它不是编译时错误。因为语法是正确的。如果有任何目的,也许微软会将它包含在以后的版本中。
  • @mikeb,我认为这样做没有任何目的。我认为这是一个有趣的问题。解释得很好。
  • @NickProzee 在某些情况下,您总是希望抛出异常。它是有效的代码,并且在异常之后强制您使用某种返回语句将是多余的。在您的示例 2 中,您显然试图返回与声明的类型不同的东西,编译器可以看到这只是简单的错误。苹果和橙子之类的。
  • @NickProzee - 它是有效代码,您的函数可以根据其签名返回值或抛出异常。如果有的话,您可能会期望编译器会发出警告,但它不应该是编译错误。
【解决方案2】:

您可以在此处阅读有关异常的信息:MSDN

异常为您提供有关已发生错误的信息。您可以轻松处理和扔掉它们。

【讨论】:

  • 这与编译器有关。抱歉,这是个不好的建议,看看@mikeb。这是一个提供清晰信息的内容丰富的答案。
猜你喜欢
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 2012-07-17
  • 2019-09-08
相关资源
最近更新 更多