最后在一个方法中尝试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;
}

最后在一个方法中尝试catch

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子句的主体

因此,不存在"运行时将发生什么"的问题。