首页 新闻 会员 周边

c#异常基础知识求解

1
悬赏园豆:5 [已解决问题] 解决于 2012-03-27 11:50

我编了一个winform程序,在一个按钮事件中执行

public void TryAndFinally()
        {
            try
            {
                int num = int.Parse("abc");
            }
            ////try语句块产生异常 finally中指定最终都要执行的子语句
            finally
            {
                MessageBox.Show("程序运行结束");
            }
        }

这个方法,为啥finally中的代码没有执行到

IT农民!的主页 IT农民! | 初学一级 | 园豆:156
提问于:2011-11-29 15:36
< >
分享
最佳答案
1

(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被输出了。

收获园豆:5
水牛刀刀 | 大侠五级 |园豆:6350 | 2011-11-29 18:07

讲的很透彻,学习了。原来只知道会在return之前执行,原来还有这么多不知道的。

artwl | 园豆:16736 (专家六级) | 2011-11-29 20:30
其他回答(4)
-2

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行就出错了,所以就没执行啦

artwl | 园豆:16736 (专家六级) | 2011-11-29 15:52

你的回答有些地方不对,如果不在调试的状态下运行,从bin目录下运行exe,即使代码出现异常,也会弹出对话框,也会把异常信息弹出了。3楼是正解

支持(0) 反对(0) IT农民! | 园豆:156 (初学一级) | 2011-11-29 17:12

@IT农民!: 嗯,我说的就是在调试状态下的情况

支持(0) 反对(0) artwl | 园豆:16736 (专家六级) | 2011-11-29 17:24
0

你如果有catch就会执行finally的。

悟行 | 园豆:12559 (专家六级) | 2011-11-29 16:23

异常是可以只有try和finally的

支持(0) 反对(0) IT农民! | 园豆:156 (初学一级) | 2011-11-29 17:12
1

你别在调试模式下执行,它是会执行到的。你可以试一下把winform程序编译成exe,然后执行exe文件,这个时候就能弹出提示了,并且它会在弹出错误之前弹出。

你的写法和@artwl 写的相同。给你几个定论:

.不管出没出现异常,finally块中的语句都会执行;
.当try或catch块中有return语句时,finally块中的语句仍会执行;
.finally块中的语句是在函数返回前执行的,但函数返回值是在finally块中语句执行前确定的;
.finally块中不能包含return语句。
LCM | 园豆:6876 (大侠五级) | 2011-11-29 16:40
0

疑惑,我试了一下,可以运行到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();
}
胡屯 | 园豆:714 (小虾三级) | 2011-11-29 16:56

我运行exe程序是可以执行的。在调试状态下就不行

支持(0) 反对(0) IT农民! | 园豆:156 (初学一级) | 2011-11-29 17:13

@IT农民!: 调试也可以呀::)

支持(0) 反对(0) 胡屯 | 园豆:714 (小虾三级) | 2011-11-29 17:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册