最后尝试抓住一个方法

时间:2014-03-21 08:01:16

标签: c# exception-handling try-catch

这里发生了什么? 我想知道在异常块之后是否可以调用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;
}

5 个答案:

答案 0 :(得分:3)

return 0;之后的finally是多余的,因为即使缓存中有异常,也会始终调用finally

无论如何,将finally块留给return会导致编译错误,这意味着在您的情况下,因为您从catch块内部抛出异常,所以不会由任何值设定。

答案 1 :(得分:2)

首先,你不能在finally块内返回值,C#不允许这样做。

即使存在错误(即控制进入catch块),

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

因此,毫无疑问“运行时会发生什么”。