zoukankan      html  css  js  c++  java
  • 异常,究竟抛向何处?

    引言
        .Net为我们提供了非常强大的异常处理功能,利用它,我们不仅可以非常方便的进行异常的处理,还可以自己定义并抛出异常,实现信息的特殊反馈。
    应用场景
        MdiForm程序中,Children Form在Load的过程中是不能Close的,即使我们需要这样做。例如:如果Children Form在Load的过程中需要读取需要的数据,但是,读取数据失败了,继续Show已经没有意义。这时我们可以利用异常机制,在读取数据失败后立即抛出异常,Parent Form在捕捉到异常后将Children Form关闭。代码大致如下:
    Parent Form中:

    FrmChild frm=new FrmChild();
    frm.MdiParent
    =this;
    try
    {
        frm.Show();
    }
    catch(Exception ex)
    {
        frm.Close();
        MessageBox.Show(ex.Message);
    }
    finally
    {
        
    //Other
    }

    Children Form中:

    private void FrmChild_Load(object sender, EventArgs e)
    {
        
    //读取数据
        if(true)//如果读取数据失败
        {
            
    throw new ApplicationException("Read Data Exception.");
        }
    }

    做完这些后,单击VS2003的“运行”按钮。Ok,正如我所想象的那样,Parent Form在Children Form抛出异常后立即将其捕获,并在关闭Children Form后显示了我想要的提示信息。
    出现问题
        正当我在为成功应用了自定义异常而高兴时,问题出现了:我在Windows中直接运行刚才生成的应用程序时,.Net向我提示:应用程序中发生了未处理的异常!不会吧,刚才还正常运行了,怎么现在就变成未处理异常了呢?但事实的确如此。
        经过调试,发现.Net在Children Form抛出异常后立即报告了未处理异常的信息,而不是象刚才那样将异常抛到Parent Form中去,即Paren Form中根本没有任何异常发生。
        问题就解决到这儿了,我百思不得其解:应用程序在VS2003环境中运行和直接运行编译后的执行文件到底有什么区别呢?在以上应用场景中如果不能用异常机制对Children Form进行关闭,又应该如何处理呢?
    致歉:按照园里的规矩,带提问性质的随笔是不应该发到首页的,我之所以发在这儿,一是问题急需解决,二是我觉得这个问题特别怪,希望发到首页和园里的更多博友进行交流。望dudu见谅。

     

  • 相关阅读:
    2.2.7将任意对象作为对象监视器
    2.2.6验证同步代码块时锁定当前对象的
    2.2.5synchronized代码间的同步性
    2.2.4一半异步,一半同步
    2.2.3用同步代码块解决同步方法的弊端
    FL2440 ubifs文件系统烧录遇到的问题——内核分区的重要性
    FL2440 rt3070模块ap模式移植
    FL2440 rt3070模块station模式动态获取IP地址
    FL2440 rt3070模块station模式移植
    fl2440 platform总线button字符设备驱动
  • 原文地址:https://www.cnblogs.com/chinadhf/p/398415.html
Copyright © 2011-2022 走看看