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指南推荐的模式(查找文本"使用异常构建器方法").
现在返回类型可以是类型,或"void"意味着"无返回类型".理论上我们可以添加第二个特殊的返回类型"never",它具有你想要的语义.包含对"never"返回方法的调用的表达式语句的结束点将被视为无法访问,因此在C#中的每个上下文中都是合法的,其中"goto","throw"或"return"是合法的.
十年后,这种类型系统不太可能被添加到类型系统中.下次从头开始设计类型系统时,请记住包含"从不"类型.
这里的问题是,如果你进入函数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语句放在函数的末尾,你会没事的.
无论应用程序通过什么执行路径,确保方法始终返回值始终是一个好主意.
你可以这样做:
catch (Exception ex)
{
Exception e = CreateSpecificFault(ex);
throw e;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9010 次 |
最近记录: |