zoukankan      html  css  js  c++  java
  • 天轰穿C# vs2010 03C#的异常处理之多个catch块【原创】

     

    小天:我觉得上面的实例还是不完美,因为在运行中出现错误的时候,我们只能获得一个我们自定义的警告信息,还有没有更好的解决方案呢?

    老田:当然有,那就是为每个可能的Exception定制解决方法。例如,上面的实例将有可能出现不同的Exception,我们则可以将Exception进行细分:类型有错误(FormatException)、超过数值范围(OverflowException)、无效输入(Exception ex),然后根据不同的Exception提出不同的解决方法。

    另外Exception 包含很多属性,可以帮助标识异常的代码位置、类型、帮助文件和原因:StackTraceInnerExceptionMessageHelpLinkHResultSourceTargetSite Data

    下面我们来对上面的实例进行完善。

                if (tb_number1.Text != "" && tb_number2.Text != "")

                {//在处理前线判断用户是否输入了值。节约系统开支(想下什么这里说这样做是为了节约系统开支)

                    try

                    {

                        //tb_number1tb_number2中获取要计算的字符

                        string txt1 = tb_number1.Text;

                        string txt2 = tb_number2.Text;

                        //将字符串转换为int类型

                        int num1 = int.Parse(txt1);

                        int num2 = int.Parse(txt2);

                        //计算,在计算的时候我们使用switch来判断用户是选择的哪一个运算符

                        int result; //该变量用来记录运算结果

                        switch (cb_flag.Text)

                        {

                            case "+":

                                result = num1 + num2;

                                break;

                            case "-":

                                result = num1 - num2;

                                break;

                            case "*":

                                result = num1 * num2;

                                break;

                            case "/":

                                result = num1 / num2;

                                break;

                            default:

                                result = 0;

                                break;

                        }

                        lbl_result.Text = result.ToString();

                    }

                    //当参数格式不符合调用的方法的参数规范时引发的异常。

                    catch (FormatException fex)

                    {

                        //MessageBox.Show(fex.Message); //直接弹出异常所携带的消息 

     

                        //弹出的警告框会让人厌恶,所以我们可以使用下面的代码来改善用户体验

                        lbl_result.Text = fex.Message;  //让显示结果的label来显示提示。

                        lbl_result.ForeColor = Color.Red;//为了更显眼,让字体变为红色

                                    //这里留一个作业,就是让字体变大,自己查MSDN

                        return;

                    }

                    catch (OverflowException ofex)

                    {//溢出错误

                        //在这个块中,我们为提示完善了更多帮助情况

    //这主要用于提示一次说不清楚,那就给个网址或者文件

                        ofex.HelpLink = "http://www.thc56.com";

                        MessageBox.Show(ofex.Message + "\n 详情请参阅" + ofex.HelpLink);

                        return;

                    }

                    catch (DivideByZeroException dze)

                    {//除零

                        MessageBox.Show(dze.Message); //直接弹出当前捕获的异常所携带的消息

                        return;

                    }

                    catch (Exception ex)

                    {//无效输入

                        MessageBox.Show(ex.Message); //直接弹出当前捕获的异常所携带的消息

                        return;

                    }

                }

                else

                {

                    MessageBox.Show("请先输入有效的值");

                    return;

                }

           上面的实例中,我们留下了几个可以给你自己修改实例达到举一反三的地方:

    1.         单独判断两个文本框是否输入了合适的值,并给出不同的提示;

    2.         改变if语句所在的位置,实现同样的效果;

    3.         改变提示错误信息的方式;

    4.         尝试删除return,看下异常和else语句块中的有什么区别;

    5.         自己查询MSDN,尝试再增加一个catch语句块;

    6.         自己在代码中动态修改Label的更多属性;

    上述练习的意义一点都不低于这个例题本身。我也只是在这个例题中为大家提出一种举一反三的思路。希望一直以为举一反三只是一种传说的朋友时刻以此反省。

    另外上面例题中还有一点是每一位初学者应该去深入理解的。就是在本例中几乎将前面学过的知识都尽量的融合进去了。要记住一句话:“知识是不断积累,不断融合的过程,而不是不断积累,不断忘记的过程”。

    当我们遇到新的知识的时候一定要想法设法把已经学过的知识融入到新的知识里面,哪怕现在看起来那绝对是多此一举。在长期的教学实践中,我发现大部分的学生都有一个通病,那就是根本无法将所有学过的知识融合起来使用。

    学技术的人分为三等:

    1.         能够使用已经学到的技术;

    2.         能够灵活运用所学的知识,并且在多套方案中找到最优化的知识点组合来实现一个优秀的解决方案;

    3.         能够灵活运用所学的知识,并且在解决方案中融入自己的思想。

     

    小天:我觉得最后一种人不是初学者能够做到的。而且我觉得第二种就很不错了。

    老田:你错了。第二种人只能算一个优秀的技术工人。但绝对不会是一个顶尖的技术牛人。而要做到把自己的思想融入解决方案也并非只对大型项目才有效。说个很简单的示例。比如军棋推演,在退一步,比如搭积木。从这些非常小的项目(我们将一切都当成项目来看待)中都可以看到思想的光芒。不同的是,平庸的人展示的是别人的思想。而顶尖的人展示的是自己的思想。

    小天:问题是我们现在学习的这些知识连编程都算不上,怎么会有思想?

    老田:真的没有吗?我们上例中提到的提高用户体验,提高系统性能。这些不是吗?其实思想无所谓大小,只是看你是否在用心去做每一个实例而已。

    另外,如果你看完这段观点后,认为你是第一种人。并且无法成为第三种人甚至第二种人。那么我建议你赶紧放下这本书。同时我要毫不留情的送你一句话:“如果你对任何事都无法用心,那么你可以停止浪费粮食和浪费所有关心你的人的感情了”。

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

  • 相关阅读:
    bzoj 4034 [HAOI2015]树上操作——树链剖分
    bzoj 1179 [Apio2009]Atm——SCC缩点+spfa
    bzoj 1123 [POI2008]BLO——点双连通分量
    poj1830开关问题——异或高斯消元
    bzoj2004公交线路——DP+矩阵加速递推
    bzoj2875随机数生成器——矩阵快速幂
    Splay模板
    map插入与查找
    bzoj1013高斯消元
    bzoj2257瓶子与燃料——最大公约数
  • 原文地址:https://www.cnblogs.com/thcjp/p/2794451.html
Copyright © 2011-2022 走看看