(1)这跟DEBUG和RELEASE模式一点关系都没有。
(2)finally块中的代码总是确保被执行的,无论return/异常/其他中断(当然你说直接电源拔了那不执行也没影响了)
(3)finally块没有handle exception的职责,那是catch块的事情
(4)你觉得finally块中的代码没执行,是因为try块中抛出了异常,而这个异常没有被捕获处理,因此处于中断模式。具体表现为:a. VS下返回代码编辑界面,弹出异常(中断了) b. 直接双击生成的.exe运行,弹出抛错窗口
(5)正确的测试方法代码如下:(建议以后都用Windows控制台程序来写测试程序)
try
{
int num = int.Parse("abc");
}
//catch { }
finally
{
Console.WriteLine("test");
}
编译之后(无论什么模式),不要双击生成的exe运行,而是进入命令行去运行。这样即使报错,也不会关闭窗口,你就能看到finally中的test被输出了。
讲的很透彻,学习了。原来只知道会在return之前执行,原来还有这么多不知道的。
finally内的代码是在try或catch中的代码执行完后,返回之前执行的,你这里try中代码还没执行完就出现异常了,当然不会弹出对话框啦。你的方法相当于这样:
1 public void TryAndFinally()
2 {
3 try
4 {
5 int num = int.Parse("abc");
6
7 return;
8 }
9 ////try语句块产生异常 finally中指定最终都要执行的子语句
10 finally
11 {
12 MessageBox.Show("程序运行结束");
13 }
14 }
finally中的代码应该在第6行时调用,但现在第5行就出错了,所以就没执行啦
你的回答有些地方不对,如果不在调试的状态下运行,从bin目录下运行exe,即使代码出现异常,也会弹出对话框,也会把异常信息弹出了。3楼是正解
@IT农民!: 嗯,我说的就是在调试状态下的情况
你如果有catch就会执行finally的。
异常是可以只有try和finally的
你别在调试模式下执行,它是会执行到的。你可以试一下把winform程序编译成exe,然后执行exe文件,这个时候就能弹出提示了,并且它会在弹出错误之前弹出。
你的写法和@artwl 写的相同。给你几个定论:
1.不管出没出现异常,finally块中的语句都会执行;
2.当try或catch块中有return语句时,finally块中的语句仍会执行;
3.finally块中的语句是在函数返回前执行的,但函数返回值是在finally块中语句执行前确定的;
4.finally块中不能包含return语句。
疑惑,我试了一下,可以运行到finally区域代码呀:(
public static void TryAndFinally()
{
try
{
int num = int.Parse("abc");
}
////try语句块产生异常 finally中指定最终都要执行的子语句
finally
{
MessageBox.Show("finally 测试");
}
}
static void Test()
{
try
{
TryAndFinally();
}
catch (ArgumentException ex)
{
MessageBox.Show(ex.Message);
}
catch (FormatException ex)
{
MessageBox.Show(ex.Message);
}
catch (OverflowException ex)
{
MessageBox.Show(ex.Message);
}
MessageBox.Show("Test Over");
}
另外,增加Test()单元测试也是可以的。
static void Main()
{
TryAndFinally();
}
我运行exe程序是可以执行的。在调试状态下就不行
@IT农民!: 调试也可以呀::)