C# - 返回后在catch块中的Rethrow异常

时间:2016-08-05 11:59:14

标签: c# exception return try-catch

请考虑以下代码:

try{
    ....

} catch(Exception) {
    return null;
    throw;
}

它有意义吗?

通常,如果在返回后放置任何代码,Visual Studio会将其标记为无法访问的代码,但对于这种情况,它不会。这有什么理由吗?

修改

作为问题的补充,我想问另一个问题。

如果我在返回后在finally块中抛出异常会怎样?

try{
    ....

} catch(Exception) {
    return null;
} finally {
    throw new Exception();
}

3 个答案:

答案 0 :(得分:4)

throw之后的return永远不会被执行。调用者的异常不是thrown。它是无法访问的代码

没有任何意义,抛出异常的方法不会向调用者返回任何内容(异常本身除外)。所以就扔吧。

try
{
    // return something valid
} 
catch(Exception) 
{
    throw;
}

至于为什么它没有被Visual Studio标记为无法访问,我认为这是一个错误。

编辑:

如果在finally块中抛出异常,则异常会在堆栈中冒泡以查找catch并且不返回该值。

答案 1 :(得分:3)

DrawingObjects:=False, Contents:=True, Scenarios:=False, AllowFormattingCells:=True, AllowFormattingColumns:=True, _AllowFormattingRows:=True, AllowInsertingHyperlinks:=True, AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True .EnableSelection = xlNoRestrictions 语句之后放置任何代码完全没有意义。它根本无法执行,无论是有效的声明还是类似的例外情况。使用return,您可以执行堆栈并且不会返回,因此应用程序无法在单个return语句之后检查代码。

您应 返回特定值抛出异常,两者都不起作用。说完这个,returnreturn语句都将保留当前方法并返回到调用方法。

另外还有throw。这有点不同,因为它意味着“从迭代器方法返回下一个元素”。

答案 2 :(得分:1)

returnthrow都会退出该方法。您的catch块永远不会抛出异常,因为您只能退出一次。因此,此处无法访问throw。但是如果存在finally块,情况可能会有所不同。请考虑以下代码。

try{
    ....

} 
catch(Exception) {
    return null;
    throw; // unreachable
}
finally
{
    //....
}

即使有任何异常,finally块内的代码也会执行,return null返回值将保持缓存状态,直到最终执行。

修改

  

如果finally块抛出异常,它会向上传播,应该是   处理更高层次。如果没有处理异常,那么   程序会崩溃

有关详情,请点击此link