这里发生了什么? 我想知道在异常块之后是否可以调用SaveError()? Main.cs是否注意到捕获的错误? 我想看看这个案子背后的故事。 变量" a"的价值是多少? ? 注意:假设try块出错了。
Main.Cs
public void RunAll()
{
....
int a = doSubTask();
}
A.cs
public int doSubTask(){
try{
..
..
return 1;
}catch(Exception Ex)
{
throw new AppException("Error", ex);
}
finally
{
SaveError();
return -1;
}
return 0;
}
答案 0 :(得分:3)
return 0;
之后的finally
是多余的,因为即使缓存中有异常,也会始终调用finally
。
无论如何,将finally
块留给return
会导致编译错误,这意味着在您的情况下,因为您从catch
块内部抛出异常,所以不会由任何值设定。
答案 1 :(得分:2)
首先,你不能在finally
块内返回值,C#不允许这样做。
finally
也会一直执行。因此,在您的情况下,返回值将始终为-1,无论是否抛出异常都无关紧要。
最后一个语句return 0;
无法访问。
答案 2 :(得分:1)
简答:这取决于你的机器^^ 正如您在此MSDN文章中看到的那样:http://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx, 如果异常未处理,则由系统决定是否执行Finally语句。
另外:您无法在finally
语句中返回值。
整个方法Foo
对我来说似乎有点混乱。
如果您的目标是尝试“冒险”操作并处理错误,则不应重新抛出异常而不使用外部代码处理该异常。
因此,如果您希望RunAll
方法知道是否存在错误,您应该在try
- catch
语句中设置它的代码并重新抛出Foo
中的异常。 1}}方法,没有finally
语句,因此重新抛出的异常“冒泡”链并在调用方法中处理:)
答案 3 :(得分:1)
我想你可以像这样修改你的代码。您不应在方法中使用多个“return”键。
public int doSubTask()
{
int retval = 0;
try
{
//to do
retval = 1;
}
catch (Exception Ex)
{
SaveError();
retval = -1;
throw new AppException("Error", ex);
}
finally
{
// do something even there is error or not
}
return retval;
}
答案 4 :(得分:0)
不允许尝试“离开”finally
块,因此在return -1;
块中说finally
无效。所以你的代码永远不会编译。
错误CS0157:控件不能离开finally子句的主体
因此,毫无疑问“运行时会发生什么”。