3 回答
TA贡献1795条经验 获得超7个赞
由于 C# 不像 Java 那样具有检查异常,因此编译器无法知道抛出者实际上抛出了异常。
但你可以颠倒逻辑
if (shouldThrow)
{
var thrower = new Thrower();
thrower.ThrowException();
}
return 1;
这样,编译器将假设返回 1,并且 ThrowException 方法是一个常规 void,它像任何其他 void 方法一样可能会抛出异常。
TA贡献1793条经验 获得超6个赞
很简单,因为编译器不会分析函数内部的代码来检测该函数是否总是抛出异常。
C# 似乎没有“永不返回”的属性。
而且,没有理由这样编写代码:
如果异常类型非常具体,您应该使用不同的异常类型。因此,您将通过调用来抛出它
throw new MyExceptionType(my_parameters);
。如果创建稍微复杂一些,那么您可以向类中添加一个静态方法来创建异常对象:
throw new MyExceptionType::CreateFromThatData(…);
如果仅从单个类引发异常,则该类中可能有一个静态函数来创建适当的异常对象。这样,您可以根据某些条件返回不同的异常类型。所有 C# 异常都源自
Exception
.如果您确实想要一个异常工厂,那么
static class
使用一些(静态)方法来创建所需的异常可能会起作用。在您的代码中,我确实没有看到创建对象
thrower
然后调用它的方法来引发异常的意义。您知道需要 2 行代码来引发异常,而不是一行。将调用隐藏
throw
在函数内会使代码更难以理解和验证。thrower.ThrowException
确实抛出异常以及是哪一个异常。正如其他答案所示,您可以首先放置引发异常的方法调用,这样编译器就不会报告某些部分不返回值。
您的设计和代码过于复杂,因此产生的问题比解决的问题还要多。
- 3 回答
- 0 关注
- 114 浏览
添加回答
举报