声明一个方法总是抛出一个异常?

noc*_*ura 25 .net c# exception-handling exception checked-exceptions

我有一个像......的方法

int f() {
  try {
    int i = process();
    return i;
  } catch(Exception ex) {
    ThrowSpecificFault(ex);
  }
}
Run Code Online (Sandbox Code Playgroud)

这会产生编译器错误,"并非所有代码路径都返回值".但在我的情况下,ThrowSpecificFault()将始终抛出(相应的)异常.所以我被迫在最后放一个返回值,但这很难看.

首先,这种模式的目的是因为"process()"是对外部Web服务的调用,但需要转换各种不同的异常以匹配客户端的预期接口(我认为是〜外观模式).

有什么更干净的方法吗?

Ces*_*Gon 58

我建议你转换ThrowSpecificFault(ex)throw SpecificFault(ex); 该SpecificFault方法将返回要抛出的异常对象而不是自己抛出它.更清洁.

这是Microsoft指南推荐的模式(查找文本"使用异常构建器方法").

  • +1,这是Microsoft指南中推荐的模式. (5认同)
  • 这是唯一真正的解决方案。在我看来,其他一切都只是绒毛。 (3认同)
  • 我这样做:http://msdn.microsoft.com/en-us/library/seyhszts.aspx; 找到文本"使用异常构建器方法". (2认同)

Eri*_*ert 9

现在返回类型可以是类型,或"void"意味着"无返回类型".理论上我们可以添加第二个特殊的返回类型"never",它具有你想要的语义.包含对"never"返回方法的调用的表达式语句的结束点将被视为无法访问,因此在C#中的每个上下文中都是合法的,其中"goto","throw"或"return"是合法的.

十年后,这种类型系统不太可能被添加到类型系统中.下次从头开始设计类型系统时,请记住包含"从不"类型.


Rob*_*ner 8

这里的问题是,如果你进入函数catch块,f()将永远不会返回值.这将导致错误,因为您声明了您的函数,int这意味着您告诉编译器您的方法将返回一个整数.

以下代码将执行您要查找的内容并始终返回一个整数.

int f() {
  int i = 0;
  try {
    i = process();

  } catch(Exception ex) {
    ThrowSpecificFault(ex);
  }
  return i;
}
Run Code Online (Sandbox Code Playgroud)

将return语句放在函数的末尾,你会没事的.

无论应用程序通过什么执行路径,确保方法始终返回值始终是一个好主意.


And*_*zub 5

你可以这样做:

catch (Exception ex)
{
    Exception e = CreateSpecificFault(ex);
    throw e;
}
Run Code Online (Sandbox Code Playgroud)