异常,究竟抛向何处?

引言
    .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见谅。

 

posted @ 2006-05-12 15:11  同一片海  阅读(1621)  评论(19编辑  收藏  举报