代码之家  ›  专栏  ›  技术社区  ›  Konrad Morawski

发布版本中未捕获异常(WinForm桌面应用程序,C_,vs 2010)

  •  2
  • Konrad Morawski  · 技术社区  · 14 年前

    我开发了一个桌面应用程序,几乎完成了,但仍然包含一些我正在消除的错误。

    我在应用程序周围使用了一个通用的[尝试…捕获]块

    [stathread]
    静态void main()
    {
    尝试
    {
    程序=新程序();
    /…
    }
    catch(异常X)
    {
    /…
    显示消息框(
    消息,
    resources.messagebox_error_crash_caption,
    messageboxbuttons.ok,确定,
    messageboxicon.error);
    }
    }
    < /代码> 
    
    

    我的程序类构造函数是:

    公共程序()
    {
    / […]
    application.enableVisualStyles();
    application.setCompatibleTextRenderingDefault(错误);
    / […]
    frmlogon=new logon();
    应用程序运行(frmlogon);
    }
    < /代码> 
    
    

    为了确保任何未处理的异常都会一直冒泡到堆栈的最上面,并且至少会用一些通信消息框来响应。

    当我在Visual Studio(调试模式)下运行应用程序时,它工作得很好,但是当我部署它并安装在我的PC上时,它就不工作了——这是当错误(顺便说一下,我已经识别)导致它从空数组中读取时我得到的结果。

    为什么?我真的很困惑。为什么它是“未处理”?据我所知,无论是发布模式还是调试模式,Try…Catch都应该有效,否则重点是什么。

    我在应用程序周围使用了一个通用的[尝试…捕获]块

    [STAThread]
    static void Main()
    {
       try
       {
           program = new Program();
           // ...
       }
       catch (Exception x)
       { 
           // ...
           MessageBox.Show(
              message,
              Resources.MESSAGEBOX_ERROR_CRASH_Caption,
              MessageBoxButtons.OK,
              MessageBoxIcon.Error);
       } 
    }
    

    我的程序类构造函数是:

    public Program()
    {
        // [...]
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        // [...]
        frmLogon = new Logon();            
        Application.Run(frmLogon);
    }        
    

    为了确保任何未处理的异常都会一直冒泡到堆栈的最上面,并且至少会用一些通信消息框来响应。

    当我在Visual Studio(调试模式)下运行应用程序时,它工作得很好,但是当我部署它并安装在我的PC上时,它就不工作了——这是当错误(顺便说一下,我已经识别)导致它从空数组中读取时我得到的结果。

    alt text

    为什么?我真的很困惑。为什么它是“未处理”?这是我的理解试试…抓住不管它是发布模式还是调试模式,都应该工作,否则重点是什么。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Eaton    14 年前

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            AppDomain.CurrentDomain.UnhandledException += ProcessAppException;
            Application.ThreadException += ProcessThrException;
            Application.Run(new MainForm());
        }
    
        private static void ProcessAppException(object sender, UnhandledExceptionEventArgs e)
        {
            XtraFunctions.LogException((Exception)e.ExceptionObject);
            throw (Exception)e.ExceptionObject; //MessageBox in your case.
        }
    
        private static void ProcessThrException(object sender, ThreadExceptionEventArgs e)
        {
            XtraFunctions.LogException(e.Exception);
            throw e.Exception; //MessageBox in your case.
        }