Как я могу получить сообщение «[MyApp] столкнулся с проблемой и должен быть закрыт» с обработкой исключения AppDomain.UnhandledException? - PullRequest
1 голос
/ 08 февраля 2012

У меня есть сообщения о том, что пользователи получают сообщение об ошибке Windows XP «[Мое приложение] обнаружило ошибку и необходимо закрыть».Это сообщение указывает на необработанное исключение в моем заявлении, верно?У меня есть исключение AppDomain.Unhandlled для обработки любых необработанных исключений из моего кода, поэтому я не уверен, как пользователи получают эту ошибку.Ответ на похожий вопрос сказал что-то о том, что отдельные потоки вызывают это, но они все еще работают в одном домене приложений, поэтому они будут обработаны, не так ли?Вот мой код обработки на тот случай, если вы обнаружите место, где выдается исключение:

public void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        #region Global Exception Handling
        string support = String.Empty;

        //try to get the support information from the common project
        try
        {
            support = Common.Constants.ErrorMessages.RETRY_OR_CONTACT_SUPPORT;
        }
        catch(Exception)
        {
            //Use hard coded support info if the common project is not accessible
            support = "Please try again or contact the Support Center at 877-555-5555";
        }

        string message = "An error occured that OASIS was not able to recover from. " + support;

        try
        {
            //Try to use the OasisErrorDialog to show the error. If the exception derives from Exception, use OasisErrorDialog to log it.
            if (e.ExceptionObject is Exception)
                OasisErrorDialog.ShowErrorDialog(message, "A Serious Error Has Occured", true, true, (Exception)e.ExceptionObject);
            else
            {
                //The exception doesn't derive from Exception so we need to try to log it using StepUp
                OasisErrorDialog.ShowErrorDialog(message, "A Serious Error Has Occured");
                ExceptionHandler.HandleException("An unhandled error that does not derive from the Exception class was thrown." + e.ExceptionObject.ToString());
            }
        }
        catch (Exception)
        {
            //The OasisErrorDialog wasn't available so display the error in a standard MessageBox
            MessageBox.Show(message, "A Serious Error Has Occured");

            try
            {
                //If the StepUp framework is still working, log the exception info
                if (e.ExceptionObject is Exception)
                    ExceptionHandler.HandleException("An unhandled exception occured", (Exception)e.ExceptionObject);
                else
                    ExceptionHandler.HandleException("An unhandled error occured: "+e.ExceptionObject.ToString());
            }
            catch (Exception) { }
        }
        #endregion
    }

1 Ответ

0 голосов
/ 08 февраля 2012

Если ваше приложение делает что-то действительно ужасное (например, неправильное взаимодействие вызывает повреждение памяти), вы не увидите исключения. Ваше приложение просто потерпит неудачу.

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

Этот вопрос и ответы на него обсуждают невозможность перехвата всех исключений.

...