none
winform窗体间的异常传递问题 RRS feed

  • 问题

  • .net framework 2.0

    假设有winform Form1和Form2,Form2在load时抛出异常,那么在用Form1调用Form2时如何才能捕获到这个异常?

     

    伪代码示例:

    Form2_Load()

    {

    InitializeComponent();

    throw new Exception("Form2 Load error");

    }

    Form1_Load()

    {

    try{

    Form2 frm=new Form2(); 

    frm.Show();

    }

    catch(Exception ex)

    {

    MessageBox.Show(ex.Message);

    }

    }

    网上搜到的微软知识库文章说:

    The Microsoft .NET Framework wraps the message pump in an exception handler. The .NET Framework only handles exceptions that reach the message pump and that the application has not already handled. Therefore, any unhandled exception that reaches the message pump is not propagated up the call stack.

    但是只有1.1的,按照他的RESOLUTION没有解决,请各位指点。

    2008年11月13日 3:53

答案

  • 呵呵,这个要仔细考虑下.net winform的异常处理机制的思路,在winform下没有像webservice等对异常做了封装并序列化传送。

    已较好解决,代码思路如下,并在此感谢版主[feiyun0112] 的热心相助。

    Code Snippet

    public partial class Form4 : Form
        {
            public delegate void CustomEventHandler(object sender, CustomExpEventArgs e);
            public event CustomEventHandler CustomEvent;

            public Form4()
            {
                InitializeComponent();
            }

            private void Form4_Load(object sender, EventArgs e)
            {
                try
                {
                    throw new Exception("Load Error");
                }
                catch (Exception ex)
                {
                    CustomEvent(this, new CustomExpEventArgs(ex));
                    this.Close();
                }
            }
        }

     

     

    Code Snippet

        public class CustomExpEventArgs : EventArgs
        {
            public Exception CustomExp;
            public CustomExpEventArgs(Exception ex)
            {
                CustomExp = ex;
            }
        }

     

     

    Code Snippet

    public partial class Form3 : Form
        {
            public Form3()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                Form4 frm = new Form4();
                frm.CustomEvent += new Form4.CustomEventHandler(frm_CustomEvent);
                frm.Show();
            }
            void frm_CustomEvent(object sender, CustomExpEventArgs e)
            {
                string msg = string.Empty;
                msg = e.CustomExp.Message;
                MessageBox.Show(msg);
            }

        }

     

     

     

    2008年11月13日 7:40

全部回复

  • 就是这样,有什么问题?

    2008年11月13日 4:56
    版主
  • 请看这句: any unhandled exception that reaches the message pump is not propagated up the call stack.

    用到这里就是说form2抛出的异常如果没有在form2中作出处理,那么他的调用者无法捕获这个异常。当然了可以在Main主函数中捕获,但这种思路不能令人满意。

    请复制伪代码并做修改,那么这样做在vs中调试是可以的,编译后点击exe文件直接运行,jit会报出未处理的异常。

    2008年11月13日 6:53
  • 呵呵,这个要仔细考虑下.net winform的异常处理机制的思路,在winform下没有像webservice等对异常做了封装并序列化传送。

    已较好解决,代码思路如下,并在此感谢版主[feiyun0112] 的热心相助。

    Code Snippet

    public partial class Form4 : Form
        {
            public delegate void CustomEventHandler(object sender, CustomExpEventArgs e);
            public event CustomEventHandler CustomEvent;

            public Form4()
            {
                InitializeComponent();
            }

            private void Form4_Load(object sender, EventArgs e)
            {
                try
                {
                    throw new Exception("Load Error");
                }
                catch (Exception ex)
                {
                    CustomEvent(this, new CustomExpEventArgs(ex));
                    this.Close();
                }
            }
        }

     

     

    Code Snippet

        public class CustomExpEventArgs : EventArgs
        {
            public Exception CustomExp;
            public CustomExpEventArgs(Exception ex)
            {
                CustomExp = ex;
            }
        }

     

     

    Code Snippet

    public partial class Form3 : Form
        {
            public Form3()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                Form4 frm = new Form4();
                frm.CustomEvent += new Form4.CustomEventHandler(frm_CustomEvent);
                frm.Show();
            }
            void frm_CustomEvent(object sender, CustomExpEventArgs e)
            {
                string msg = string.Empty;
                msg = e.CustomExp.Message;
                MessageBox.Show(msg);
            }

        }

     

     

     

    2008年11月13日 7:40
  • 泉泉,感谢你分享你的经验来帮助更多的人!
    2008年11月13日 8:03
    版主
  • 呵呵,祝贺你当选为斑竹,以后多帮兄弟的忙哦。

    2008年11月13日 8:21
  • 多谢!也希望你以后多多支持这个版块啊!
    2008年11月13日 11:31
    版主