让我说我有这两个功能:
private string otherString;
private void Error(string message) {
throw new Exception("Error: " + message);
}
private void Expected(string message) {
Error("Expected " + message + " got " + otherString);
}
现在我想编写看起来像这样的代码:
private int ReadInt() {
int result = 0;
if(int.TryParse(otherString, out result)) {
return result;
}
Expected("Int");
//return 0; is need to compile but it will be never reached
}
据我所知,编译器不能假设通过调用Expected ReadInt函数将结束。有没有其他方法可以做我想做的事情,而不需要在我想要以错误退出的每个地方写入throw语句?
throw new Exception("Error: Expected Digit got " + otherString);
答案 0 :(得分:4)
可能你以后会记录/捕获这个异常,这就是问题,在当前设置中你不会知道(直接)实际发生异常的地方,来自{{1}你将只获得有关方法TargetSite
抛出异常而不是实际方法Error
的信息。 (尽管通过Stack Trace可以看到调用层次结构和ReadInt
方法)。
抛出异常,而不是从某些泛型方法抛出异常。而不是抛出基类异常,抛出特定的异常,如ReadInt
等。
作为附注,如果您只关心解析相关的异常,请不要使用InvalidArgumentException
方法组,并让原始异常冒泡。
答案 1 :(得分:1)
除了其他答案所说的(不要这样做,这不是一个好习惯),你可以简单地愚弄"编译器通过使用error-method返回伪值:
td
{border:1px solid #333};
另一种可能性(如评论中所建议的)是返回异常并将其抛入方法中:
<div ng-app ng-controller="MyCtrl">
<table>
<tr>
<td ng-repeat="(k, column) in tableDatas[0].dataMap">{{k}}</td>
</tr>
<tr>
<td ng-repeat="(k, column) in tableDatas[0].dataMap">{{column[0]}}
</td>
</tr>
<tr>
<td ng-repeat="(k, column) in tableDatas[0].dataMap">{{column[1]}}
</td>
</tr>
<tr>
<td ng-repeat="(k, column) in tableDatas[0].dataMap">{{column[2]}}
</td>
</tr>
</table>
</div>
最后但并非最不重要的是,您可以创建自己的异常并抛出该异常:
private string otherString;
private T Error<T>(string message) {
throw new Exception("Error: " + message);
return default(T);
}
private T Expected<T>(string message) {
return Error<T>("Expected " + message + " got " + otherString);
}
private int ReadInt() {
int result = 0;
if(int.TryParse(otherString, out result)) {
return result;
}
return Expected<int>("Int");
}