天轰穿C# vs2010 03C#的异常处理之异常处理的系统流程【原创】

 

小天:通过刚才多次断点调试,我发现如果没有错误,则无论多少个catch块都不会执行。而发生错误后,它也不会挨个catch块去判断,而是直接找到对应的catch块。能不能详细跟我说下异常处理的系统流程。

老田:好的,当你的程序遇到一个非正常情况,比如说内存不足,它就会引发(throw/raise)一个异常。此时,当前的过程调用将挂起,.NET 运行时(CLR)将从下至上搜索过程调用堆栈,以查找相应的异常处理程序。也就是说,如果抛出异常的代码正处于某个 Try 块中,运行时将首先使用本地的 Catch 块(如果有)来处理异常(它将执行在该位置找到的 Catch 块代码),否则这个程序段将被终止并将异常的处理权交给其调用函数;如果没有函数处理此异常(即在整个调用堆栈中没能找到适当的 Catch 块),最终运行时将会得到并处理它,并立刻将你的程序终止。

l  No exception表示的是无异常时的程序运行流程: 程序在执行try程序模块的时候,如果没有出现异常,程序将跳过catch段直接到setp4

l  Statement1 fails表示程序在执行过程中出现异常的程序运行流程:程序在执行try程序模块的时候,程序将立刻直接进入catch段。

另外有两点需要提醒的是:

1:如果您想让异常处理继续,你要在catch子句中写出一些具体的方法,空的catch段相当于给异常放行。因此进行完catch子句后,应该使用return, throw, 或者exit来跳出程序的执行。

2catch块的次序必须十分小心,比如一个DivideByZeroException 异常继承自ArithmeticException异常,如果你先捕获后者,则当除数为0时抛出的异常就会进入ArithmeticException块而永远不会进入DivideByZeroException块。事实上,当这种情况出现时,编译器会发现DivideByZeroException块不能被执行到,并会报告一个编译错误。

       接下来再看个实例,步骤如下:

1.       在上面创建的“异常第一个实例”的Windows桌面应用程序中添加一个名为“systemflow”的新窗体。

2.       Program.cs中修改启动窗体。

3.       在这个窗体上分别放如下控件,并修改属性:

                        i.              一个Label,修改Text属性为“请输入整型数据”;

                      ii.              一个TextBox,修改name属性为tb_num

                    iii.              一个Button,修改Text属性为“转换”;

  4.       双击“转换”按钮,添加如下代码:

        private void button1_Click(object sender, EventArgs e)

        {

            try

            {

                int i = int.Parse(tb_num.Text);

                //思考下面这句话的意思

                button1.Text += "之后的结果是: " + i.ToString();

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

                return;

            }

            catch (FormatException fex) //编译器会在这里给出错误提示

            {

                MessageBox.Show(fex.Message);

                return;

            }

        }

5.       这个示例就不用运行了,因为运行也只会得到一个错误提示。不过上面例题中,我们一如既往的将运算符的知识给融合进来了。

6.       给个作业,就是将上面例题修改正确。

本文章为天轰穿原创作品,转载请注明出处及作者。

原文地址:https://www.cnblogs.com/thcjp/p/2796106.html