Исключения, не обнаруженные в сборке релиза (WinForm, настольное приложение, C #, VS 2010) - PullRequest
2 голосов
/ 07 октября 2010

Я разработал настольное приложение, оно почти готово, но все еще содержит некоторые ошибки, которые я устраняю.

Я использую общий блок [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 (режим отладки), но когда я развернул его и установил на своем компьютере, это не так - вот что я получаю, когда ошибка (которую я уже определил,способ) заставляет его читать из нулевого массива

alt text

Почему?Это действительно сбивает меня с толку.Почему это было "необработанным"?Насколько я понимаю, try ... catch должен работать независимо от того, является ли это выпуском или режимом отладки, иначе какой бы смысл.

1 Ответ

1 голос
/ 24 ноября 2010

Это довольно старое, но если вам все еще нужно решение, вам нужно обработать некоторые события, заключив все в пробный улов, не сработает. Сделайте что-то вроде этого:

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

Когда исключение не обнаружено, оно проходит через одно из них перед отображением диалогового окна исключения. Таким образом, у вас есть возможность переопределить его и отобразить хорошее сообщение по вашему выбору.

...