Поделиться через


Как вывести окно сообщения об исключении программы

Можно воспользоваться окном сообщения об исключении в приложениях, чтобы предоставить значительно больше возможностей управления информированием, чем в классе MessageBox. Дополнительные сведения см. в разделе Программирование окон сообщений об исключениях. Сведения о том, как получить и развернуть библиотеку DLL окна сообщений об исключениях, см. в разделе Развертывание приложения для вывода сообщения об исключении.

Описание процедуры

Обработка исключения с помощью окна сообщения об исключении

  1. Добавьте ссылку на сборку Microsoft.ExceptionMessageBox.dll в свой проект управляемого кода.

  2. Добавьте директиву using (C#) или инструкцию Imports (Microsoft Visual Basic .NET) для использования пространства имен Microsoft.SqlServer.MessageBox (необязательно).

  3. Создайте блок try-catch для обработки ожидаемого исключения.

  4. В блоке catch создайте экземпляр класса ExceptionMessageBox. Передайте объект Exception, обрабатываемый в блоке try-catch.

  5. Установите одно или несколько следующих свойств объекта ExceptionMessageBox (необязательно).

    • Buttons - ExceptionMessageBoxButtons — перечисление, указывающее кнопки для отображения в окне сообщения об исключении.

    • DefaultButton - ExceptionMessageBoxDefaultButton — перечисление, указывающее кнопку по умолчанию для окна сообщения об исключении.

    • Options - ExceptionMessageBoxOptions — перечисление, используемое для управления другими аспектами поведения окна сообщения об исключении.

    • Symbol - ExceptionMessageBoxSymbol — перечисление, указывающее символ для отображения в окне сообщения об исключении.

  6. Вызовите метод Show. Передайте ему родительское окно, которому принадлежит окно сообщения об исключении.

  7. Отметьте возвращаемое значение перечисления DialogResult, если требуется определить, какую кнопку нажал пользователь (необязательно).

Отображение окна сообщения об исключении без самого исключения

  1. Добавьте ссылку на сборку Microsoft.ExceptionMessageBox.dll в свой проект управляемого кода.

  2. Добавьте директиву using (C#) или инструкцию Imports (Visual Basic .NET) для использования пространства имен Microsoft.SqlServer.MessageBox (необязательно).

  3. Создайте экземпляр класса ExceptionMessageBox. Передайте текст сообщения как значение объекта String.

  4. Установите одно или несколько следующих свойств объекта ExceptionMessageBox (необязательно).

    • Buttons - ExceptionMessageBoxButtons — перечисление, указывающее кнопки для отображения в окне сообщения об исключении.

    • Caption — заголовок диалогового окна для окна сообщения об исключении.

    • DefaultButton - ExceptionMessageBoxDefaultButton — перечисление, указывающее кнопку по умолчанию диалогового окна для окна сообщения об исключении.

    • Options - ExceptionMessageBoxOptions — перечисление, используемое для управления другими аспектами поведения окна сообщения об исключении.

    • Symbol - ExceptionMessageBoxSymbol — перечисление, указывающее символ для отображения в окне сообщения об исключении.

  5. Вызовите метод Show. Передайте ему родительское окно, которому принадлежит окно сообщения об исключении.

  6. Отметьте возвращаемое значение перечисления DialogResult, если требуется определить, какую кнопку нажал пользователь (необязательно).

Отображение окна сообщения об исключении с пользовательскими кнопками

  1. Добавьте ссылку на сборку Microsoft.ExceptionMessageBox.dll в свой проект управляемого кода.

  2. Добавьте директиву using (C#) или инструкцию Imports (Visual Basic .NET) для использования пространства имен Microsoft.SqlServer.MessageBox (необязательно).

  3. Создайте экземпляр класса ExceptionMessageBox одним из двух способов.

    • Передайте объект Exception, обрабатываемый в блоке try-catch.

    • Передайте текст сообщения как значение объекта String.

  4. Установите одно из следующих значений для свойства Buttons.

    • AbortRetryIgnore — отображает кнопки Прервать, Повторить и Пропустить.

    • Custom — отображает пользовательские кнопки.

    • OK — отображает кнопку ОК.

    • OKCancel — отображает кнопки ОК и Отмена.

    • RetryCancel — отображает кнопки Повторить и Отмена.

    • YesNo — отображает кнопки Да и Нет.

    • YesNoCancel — отображает кнопки Да, Нет и Отмена.

  5. При использовании пользовательских кнопок вызовите один из перегруженных методов SetButtonText, чтобы указать текст для пользовательских кнопок, количество которых не более пяти (необязательно).

  6. Вызовите метод Show. Передайте ему родительское окно, которому принадлежит окно сообщения об исключении.

  7. Отметьте возвращаемое значение перечисления DialogResult, если требуется определить, какую кнопку нажал пользователь (необязательно). При использовании пользовательских кнопок отметьте значение объекта ExceptionMessageBoxDialogResult для свойства CustomDialogResult, чтобы определить, какую пользовательскую кнопку нажал пользователь.

Как разрешить пользователям показывать или не показывать окно сообщения об исключении

  1. Добавьте ссылку на сборку Microsoft.ExceptionMessageBox.dll в свой проект управляемого кода.

  2. Добавьте директиву using (C#) или Imports (Visual Basic .NET) для использования пространства имен Microsoft.SqlServer.MessageBox (необязательно).

  3. Создайте экземпляр класса ExceptionMessageBox одним из двух способов.

    • Передайте объект Exception, обрабатываемый в блоке try-catch.

    • Передайте текст сообщения как значение объекта String.

  4. Установите свойство ShowCheckbox()()()() в значение true.

  5. Укажите текст с вопросом пользователю, показывать ли снова окно сообщения об исключении, для свойства CheckboxText()()()() (необязательно). По умолчанию используется текст «Не показывать больше это сообщение».

  6. Если требуется сохранять принятое пользователем решение лишь на протяжении выполнения приложения, присвойте значение свойства IsCheckboxChecked()()()() глобальной переменной Boolean. Вычислите это значение перед созданием экземпляра окна сообщения об исключении.

  7. Если необходимо постоянно хранить принятое пользователем решение, выполните следующее.

    1. Вызовите метод CreateSubKey(String), чтобы открыть используемый вашим приложением пользовательский раздел реестра, и задайте значение CheckboxRegistryKey()()()(), равное возвращаемому объекту RegistryKey.

    2. Установите в свойстве CheckboxRegistryValue()()()() имя используемого значения реестра.

    3. Присвойте параметру CheckboxRegistryMeansDoNotShowDialog()()()() значение true.

    4. Вызовите метод Show. Вычисляется указанный раздел реестра, и окно сообщения об исключении отображается только тогда, когда хранящиеся в разделе реестра данные равны 0. Если же отображается диалоговое окно и пользователь устанавливает флажок до нажатия кнопки, то данным в разделе реестра присваивается 1.

Пример

В этом примере используется окно сообщения об исключении только с кнопкой ОК, чтобы отобразить сведения из исключения приложения, которые включают в себя обрабатываемое исключение и дополнительную информацию, отражающую специфику данного приложения.

          try
            {
                // Do something that may generate an exception.
                throw new ApplicationException("An error has occured");
            }
            catch (ApplicationException ex)
            {
                // Define a new top-level error message.
                string str = "The action failed.";

                // Add the new top-level message to the handled exception.
                ApplicationException exTop = new ApplicationException(str, ex);
                exTop.Source = this.Text;

                // Show an exception message box with an OK button (the default).
                ExceptionMessageBox box = new ExceptionMessageBox(exTop);
                box.Show(this);
            }
Try
    ' Do something that may generate an exception.
    Throw New ApplicationException("An error has occured")
Catch ex As ApplicationException
    ' Define a new top-level error message.
    Dim str As String = "The action failed."

    ' Add the new top-level message to the handled exception.
    Dim exTop As ApplicationException = New ApplicationException(str, ex)
    exTop.Source = Me.Text

    ' Show an exception message box with an OK button (the default).
    Dim box As ExceptionMessageBox = New ExceptionMessageBox(exTop)
    box.Show(Me)
End Try

В этом примере используется окно сообщения об исключении с кнопками Да и Нет, одну из которых выбирает пользователь.

          // Define the message and caption to display.
            string str = @"Are you sure you want to delete file 'c:\somefile.txt'?";
            string caption = "Confirm File Deletion";

            // Show the exception message box with Yes and No buttons.
            ExceptionMessageBox box = new ExceptionMessageBox(str,
                caption, ExceptionMessageBoxButtons.YesNo,
                ExceptionMessageBoxSymbol.Question,
                ExceptionMessageBoxDefaultButton.Button2);

            if (DialogResult.Yes == box.Show(this))
            {
                // Delete the file.
            }
' Define the message and caption to display.
Dim str As String = "Are you sure you want to delete file 'c:\somefile.txt'?"
Dim caption As String = "Confirm File Deletion"

' Show the exception message box with Yes and No buttons.
Dim box As ExceptionMessageBox = New ExceptionMessageBox(str, _
 caption, ExceptionMessageBoxButtons.YesNo, _
 ExceptionMessageBoxSymbol.Question, _
 ExceptionMessageBoxDefaultButton.Button2)

If Windows.Forms.DialogResult.Yes = box.Show(Me) Then
    ' Delete the file.
End If

В этом примере используется окно сообщения об исключении с пользовательскими кнопками.

         try
            {
                // Do something that may cause an exception.
                throw new ApplicationException("An error has occured");
            }
            catch (ApplicationException ex)
            {
                string str = "Action failed. What do you want to do?";
                ApplicationException exTop = new ApplicationException(str, ex);
                exTop.Source = this.Text;

                // Show the exception message box with three custom buttons.
                ExceptionMessageBox box = new ExceptionMessageBox(exTop);

                // Set the names of the three custom buttons.
                box.SetButtonText("Skip", "Retry", "Stop Processing");

                // Set the Retry button as the default.
                box.DefaultButton = ExceptionMessageBoxDefaultButton.Button2;
                box.Symbol = ExceptionMessageBoxSymbol.Question;
                box.Buttons = ExceptionMessageBoxButtons.Custom;

                box.Show(this);

                // Do something, depending on the button that the user clicks.
                switch (box.CustomDialogResult)
                {
                    case ExceptionMessageBoxDialogResult.Button1:
                        // Skip action
                        break;
                    case ExceptionMessageBoxDialogResult.Button2:
                        // Retry action
                        break;
                    case ExceptionMessageBoxDialogResult.Button3:
                        // Stop processing action
                        break;
                }
            }
Try
    ' Do something that may cause an exception.
    Throw New ApplicationException("An error has occured")
Catch ex As ApplicationException
    Dim str As String = "Action failed. What do you want to do?"
    Dim exTop As ApplicationException = New ApplicationException(str, ex)
    exTop.Source = Me.Text

    ' Show the exception message box with three custom buttons.
    Dim box As ExceptionMessageBox = New ExceptionMessageBox(exTop)

    ' Set the names of the three custom buttons.
    box.SetButtonText("Skip", "Retry", "Stop Processing")

    ' Set the Retry button as the default.
    box.DefaultButton = ExceptionMessageBoxDefaultButton.Button2
    box.Symbol = ExceptionMessageBoxSymbol.Question
    box.Buttons = ExceptionMessageBoxButtons.Custom

    box.Show(Me)

    ' Do something, depending on the button that the user clicks.
    Select Case box.CustomDialogResult
        Case ExceptionMessageBoxDialogResult.Button1
            ' Skip action
        Case ExceptionMessageBoxDialogResult.Button2
            ' Retry action
        Case ExceptionMessageBoxDialogResult.Button3
            ' Stop processing action
    End Select
End Try

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

           try
            {
                // Do something that may cause an exception.
                throw new ApplicationException("An error has occured.");
            }
            catch (ApplicationException ex)
            {
                string str = "The action failed.";
                ApplicationException exTop = new ApplicationException(str, ex);
                exTop.Source = this.Text;

                // Show a message box if the global variable is true.
                if (alwaysShow)
                {
                    ExceptionMessageBox box = new ExceptionMessageBox(exTop);
                    box.ShowCheckBox = true;
                    box.IsCheckBoxChecked = true;
                    box.CheckBoxText = "Always show this message";
                    box.Show(this);

                    // Set the global variable.
                    alwaysShow = box.IsCheckBoxChecked;
                }
            }
Try
    ' Do something that may cause an exception.
    Throw New ApplicationException("An error has occured.")
Catch ex As ApplicationException
    Dim str As String = "The action failed."
    Dim exTop As ApplicationException = New ApplicationException(str, ex)
    exTop.Source = Me.Text

    ' Show a message box if the global variable is true.
    If alwaysShow Then
        Dim box As ExceptionMessageBox = New ExceptionMessageBox(exTop)
        box.ShowCheckBox = True
        box.IsCheckBoxChecked = True
        box.CheckBoxText = "Always show this message"
        box.Show(Me)

        ' Set the global variable.
        alwaysShow = box.IsCheckBoxChecked
    End If
End Try

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

          try
            {
                // Do something that could generate an exception.
                throw new ApplicationException("An error has occured.");
            }
            catch (ApplicationException ex)
            {
                string str = "The action failed. Do you want to continue?";
                ApplicationException exTop = new ApplicationException(str, ex);
                exTop.Source = this.Text;

                // Show a message box with Yes and No buttons
                ExceptionMessageBox box = new ExceptionMessageBox(exTop,
                    ExceptionMessageBoxButtons.YesNo,
                    ExceptionMessageBoxSymbol.Question,
                    ExceptionMessageBoxDefaultButton.Button2);

                // Enable the check box.
                box.ShowCheckBox = true;

                // Define the registry key to use.
                box.CheckBoxRegistryKey =
                    Microsoft.Win32.Registry.CurrentUser.CreateSubKey(
                    @"Software\TestApp");
                box.CheckBoxRegistryValue = "DontShowActionFailedMessage";
                box.CheckBoxRegistryMeansDoNotShowDialog = true;
                box.DefaultDialogResult = DialogResult.Yes;

                // The message box won’t be displayed if the
                // "DontShowActionFailedMessage" value of the registry key 
                // contains a non-zero value.
                if (box.Show(this) == DialogResult.No)
                {
                    // Do something if the user clicks the No button.
                    this.Close();
                }
            }
Try
    ' Do something that could generate an exception.
    Throw New ApplicationException("An error has occured.")
Catch ex As ApplicationException
    Dim str As String = "The action failed. Do you want to continue?"
    Dim exTop As ApplicationException = New ApplicationException(str, ex)
    exTop.Source = Me.Text

    ' Show a message box with Yes and No buttons
    Dim box As ExceptionMessageBox = New ExceptionMessageBox(exTop, _
     ExceptionMessageBoxButtons.YesNo, _
     ExceptionMessageBoxSymbol.Question, _
     ExceptionMessageBoxDefaultButton.Button2)

    ' Enable the check box.
    box.ShowCheckBox = True

    ' Define the registry key to use.
    box.CheckBoxRegistryKey = _
    Microsoft.Win32.Registry.CurrentUser.CreateSubKey( _
     "Software\TestApp")
    box.CheckBoxRegistryValue = "DontShowActionFailedMessage"
    box.CheckBoxRegistryMeansDoNotShowDialog = True
    box.DefaultDialogResult = Windows.Forms.DialogResult.Yes

    ' The message box won�t be displayed if the
    ' "DontShowActionFailedMessage" value of the registry key 
    ' contains a non-zero value.
    If box.Show(Me) = Windows.Forms.DialogResult.No Then
        ' Do something if the user clicks the No button.
        Me.Close()
    End If
End Try

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

            try
            {
                // Do something that you don't expect to generate an exception.
                throw new ApplicationException("Failed to connect to the server.");
            }
            catch (ApplicationException ex)
            {
                string str = "An unexpected error occurred. Please call Helpdesk.";
                ApplicationException exTop = new ApplicationException(str, ex);
                exTop.Source = this.Text;

                // Information in the Data property of an exception that has a name
                // beginning with "HelpLink.Advanced" is shown when the user
                // clicks the Advanced Information button of the exception message
                // box dialog box.
                exTop.Data.Add("AdvancedInformation.FileName", "application.dll");
                exTop.Data.Add("AdvancedInformation.FilePosition", "line 355");
                exTop.Data.Add("AdvancedInformation.UserContext", "single user mode");

                // Show the exception message box with additional information that 
                // is helpful when a user calls technical support.
                ExceptionMessageBox box = new ExceptionMessageBox(exTop);

                box.Show(this);
            }
Try
    ' Do something that you don't expect to generate an exception.
    Throw New ApplicationException("Failed to connect to the server.")
Catch ex As ApplicationException
    Dim str As String = "An unexpected error occurred. Please call Helpdesk."
    Dim exTop As ApplicationException = New ApplicationException(str, ex)
    exTop.Source = Me.Text

    ' Information in the Data property of an exception that has a name
    ' beginning with "HelpLink.Advanced" is shown when the user
    ' clicks the Advanced Information button of the exception message
    ' box dialog box.
    exTop.Data.Add("AdvancedInformation.FileName", "application.dll")
    exTop.Data.Add("AdvancedInformation.FilePosition", "line 355")
    exTop.Data.Add("AdvancedInformation.UserContext", "single user mode")

    ' Show the exception message box with additional information that 
    ' is helpful when a user calls technical support.
    Dim box As ExceptionMessageBox = New ExceptionMessageBox(exTop)

    box.Show(Me)

End Try