在被调用函数中通过异常保留当前函数

时间:2015-06-25 13:20:02

标签: c# exception

让我说我有这两个功能:

 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);

2 个答案:

答案 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");
 }