问个基础问题,关于try..catch..finally

doocoo 2010-05-13 10:41:57
我试验了一下这段代码:
        static string testtryfinal()
{
string result = "";
try
{
result = "A";
if (result == "A")
throw new Exception();
}
catch {
result = "C";
}
finally
{
result = "B";
Console.WriteLine("FINAL");
}
return result;
}

结果输出为:
FINAL
B
这个结果我明白,catch了以后还得finally,所以result="B"

但是我把程序改成这样:
        static string testtryfinal()
{
string result = "";
try
{
result = "A";
if (result != "A")
throw new Exception();
return result;
}
catch {
result = "C";
return result;
}
finally
{
result = "B";
Console.WriteLine("FINAL");
}
}


这一次的输出为:
FINAL
A

我的疑问是:既然finally块中的代码,无论会不会引发异常均会执行,那么输出为什么不是B?
输出里面有"FINAL",说明finally代码还是执行了
为什么result="B"这一行没有执行?
...全文
135 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
doocoo 2010-05-14
  • 打赏
  • 举报
回复
谢谢各位,也就是说return并没有终止函数的运行,而是返回值后继续执行finally块的代码?
whatismynickname 2010-05-14
  • 打赏
  • 举报
回复
因为执行到return的时候,你的方法体已经执行完毕了。
liu954228114 2010-05-14
  • 打赏
  • 举报
回复
刚学习C#,看看各位的问题,对我也有所帮助
chuanshuo1999 2010-05-14
  • 打赏
  • 举报
回复
并不是return没有终止函数的运行,是因为你的return是在try catch finally程序块中执行,在此程序中执行的代码最终都会通过finally程序块然后退出try部分。
zlz_212 2010-05-13
  • 打赏
  • 举报
回复
string是特殊的引用类型
把你的代码修改一下:
class Program
{
public static void Main(string[] args)
{
// TODO: Implement Functionality Here

TT b=new TT(){ T1=""};
testtryfinal(b);
Console.Write(b.T1);
Console.ReadKey(true);
}

static TT testtryfinal(TT result)
{
result.T1=string.Empty;
try
{
result.T1 = "A";
if (result.ToString() != "A")
throw new Exception();
return result;
}
catch {
result.T1 = "C";
return result;
}
finally
{
result.T1 = "B";
Console.WriteLine("FINAL");
}
}

}
class TT{
public object T1{get;set;}
}

输出什么?自己看看就知道了
jameney 2010-05-13
  • 打赏
  • 举报
回复
函数的返回值还取决你在何时返回值
yufenghua 2010-05-13
  • 打赏
  • 举报
回复
今天才学 看一下
阿双2009 2010-05-13
  • 打赏
  • 举报
回复
设断点 调试下
运行过程就一清二楚了。
lianglin999 2010-05-13
  • 打赏
  • 举报
回复
自己可以调试代码,就会看到他显示return,在finally,这种问题可以学着调试,自己解决
jingzaiZ 2010-05-13
  • 打赏
  • 举报
回复
result = "B" 这句话当然执行的啦(无论怎么样,finally代码块肯定会执行的)
所以最后result == "B"
但执行return result语句的时候result == "A"
youyou2404 2010-05-13
  • 打赏
  • 举报
回复
先 return..
wuyq11 2010-05-13
  • 打赏
  • 举报
回复
先执行return result
Console.WriteLine("FINAL");
zzx509 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 doocoo 的回复:]
为什么result="B"这一行没有执行?
[/Quote]
这一句也执行了。
finally是在return语句后执行的,先return到调用方,返回A
紧接着执行finally,执行result="B", 输出FINAL
由于testtryfinal方法已经返回只给了调用方,不会再次return了,本次附值为B仅影响局部变量result,不会影响方法的返回结果

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧