2

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

我在我的应用程序周围使用了一个通用的 [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);
   } 
}

我的 Program 类构造函数是:

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

以确保任何未处理的异常都会在堆栈中一直冒泡,并且至少会以一些可通信的消息框进行响应。

当我在 Visual Studio(调试模式)下运行应用程序时它工作正常,但是当我将它部署并安装在我的 PC 上时,它没有 - 这就是我得到的错误(顺便说一下,我已经确定) ) 导致它从一个空数组中读取

替代文字

为什么?这真的让我很困惑。为什么它“未处理”?我的理解是,无论是发布模式还是调试模式,try...catch都应该工作,否则有什么意义。

4

1 回答 1

1

这有点老了,但是如果您仍然需要解决方案,则需要处理一些事件,将整个事物包含在 try catch 中是行不通的。做这样的事情:

    /// <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.
    }

当未捕获异常时,它将在显示异常对话框之前通过其中之一。因此,您可以选择覆盖它并显示您选择的好消息。

于 2010-11-24T03:56:16.273 回答