日期:2014-05-18  浏览次数:20755 次

异常问题
static void Main(string[] args)
  {
  Console.WriteLine(Method());
  }
  static string Method()
  {
  string str = "1";
  try
  {
  int i = 0;
  if (5 / i == 0)
  {
  str += "2";
  }

  }
  catch
  {

  str += "3";
  return str;
  }
  finally 
  {
  str += "4";
  }
  return str;
  }
运行程序返回结果怎么不是134呢,谢谢!

------解决方案--------------------
catch中去掉return
------解决方案--------------------
虽然你在finally里面为str加了一个"4"字符,但是由于在catch已经调用了return str,return的作用并非是简单的返回,它会将返回值放到堆栈中,并且执行了其他的恢复性操作后,再返回到调用者。
在return处将str放入堆栈中,虽然在finally里面操作了str,但是string类型的变量都是值传递的,并非代表一个引用,所以你在finally里面对str作的操作不会影响已经在堆栈中的返回值。
你可以写一个类,将str放入该类中,Method中直接操作该类的str属性,Method的返回值也是该类的实例,这样作之后,你的返回值就"134".
------解决方案--------------------
探讨
虽然你在finally里面为str加了一个"4"字符,但是由于在catch已经调用了return str,return的作用并非是简单的返回,它会将返回值放到堆栈中,并且执行了其他的恢复性操作后,再返回到调用者。
在return处将str放入堆栈中,虽然在finally里面操作了str,但是string类型的变量都是值传递的,并非代表一个引用,所以你在finally里面对str作的操作不会影响已……

------解决方案--------------------
三楼说的很明白,catch到异常后,执行后保存好了,然后执行finally,然后返回保存的值,finally修改不了保存好的值