最后在一个方法中尝试catch
本文关键字:方法 catch 一个 最后 | 更新日期: 2023-09-27 17:51:19
这里发生了什么?我想知道SaveError()是否可以在异常块后调用?Main.cs会注意到捕获的错误吗?我想知道这个案子背后的故事。变量a的值是多少?注意:在try块中出现错误。
c
public void RunAll()
{
....
int a = doSubTask();
}
交流
public int doSubTask(){
try{
..
..
return 1;
}catch(Exception Ex)
{
throw new AppException("Error", ex);
}
finally
{
SaveError();
return -1;
}
return 0;
}
finally
之后的return 0;
是冗余的,因为finally
将始终被调用,即使缓存中有异常或没有。
无论如何,用return
离开finally
块会导致编译错误,这意味着在您的情况下,因为您从catch
块内部抛出异常,a将不会由任何值设置。
首先,你不能在finally
块内返回值,c#不允许这样。
finally
总是执行,即使有错误(即控制进入catch块)。因此,在您的情况下,返回值将始终为-1,这与是否抛出异常无关。
最后一条语句return 0;
不可达
我想你可以这样修改你的代码。你不应该在一个方法中使用多个"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;
}
简短的回答:这取决于你的机器^^正如你在这篇MSDN文章中看到的:http://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx,如果异常未处理,则由系统决定是否执行Finally语句。
还有:你不能在finally
语句中返回值。
整个方法Foo
对我来说似乎有点混乱。如果您的目标是尝试"有风险"的操作并处理错误,则不应该在没有外部代码处理的情况下重新抛出异常。
所以,如果你想让RunAll
方法知道是否有一个错误,你应该在try
- catch
语句中设置它的代码,并在Foo
方法中重新抛出异常,没有finally
语句,所以重新抛出的异常"冒泡"链并在调用方法中得到处理:)
不允许尝试"离开" finally
块,因此在finally
块内说return -1;
是无效的。所以你的代码永远不会编译。
错误CS0157:控制不能离开finally子句的主体
因此,不存在"运行时将发生什么"的问题。