c# - 为什么异常总是被接受为返回类型(抛出时)?

标签 c# .net exception exception-handling compilation

Why are exceptions always accepted as a return type (thrown)?

有效示例 1:

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

无效示例(显然):

public string foo()
{
 return 8080;
}

有效示例 2:

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


我可以看到我的“无效示例”是“抛出”而不是“返回”异常,但是,我的方法从不返回该方法定义的类型。为什么我的编译器允许它编译?

最佳答案

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

你的有效示例 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";
}

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

关于c# - 为什么异常总是被接受为返回类型(抛出时)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33805787/

相关文章:

c# - HttpRequestMessage.Content 在 ASP.Net Web API 中的日志记录 DelegatingHandler 中读取时丢失

c# - 使用 WCF 更改规范化算法

c# - 如何在生成 Excel 工作表时为列值添加颜色?

c# - 如何在带有配置文件的 Powershell 脚本中使用自定义 WCF 代理?

java - Try block 不会抛出任何异常,但没有发生编译时错误

c# - 如何从 silverlight for wp7 中的不可编辑文本框中获取选定的文本

c# - 检查路径是文件还是目录的更好方法?

c# - Lazy<T> 延迟加载错误 : A field initializer cannot reference the non-static field, 方法或属性

android - 获取 "com.android.ddmlib.AdbCommandRejectedException: closed"异常?

java - 检查 org.jooq.exception.DataAccessException 是否序列化失败