Замена стандартной формы исключения / ошибки в .net - PullRequest
7 голосов
/ 01 ноября 2010

Я думал, можно ли "переопределить" или, возможно, заменить стандартные winforms .net Exception form ??

Я говорю об этом чувак:

alt text

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

Ответы [ 5 ]

2 голосов
/ 01 ноября 2010

Это класс ThreadExceptionDialog, он наследуется от класса Form.Извлечение из него, чтобы изменить диалог - заброшенная причина, вы не можете легко добраться до встроенных элементов управления.Вы можете создать свой собственный производный класс Form, чтобы создать собственный диалог, просто предоставьте ему конструктор, который принимает аргумент Exception.Реализуйте обработчик событий для Application.ThreadException, чтобы отобразить его.

Обратите внимание на фундаментальный недостаток в диалоговом окне.Он ожидает, что пользователь сделает правильный выбор, когда ему нужно нажать кнопку, чтобы закрыть диалоговое окно.Имея, в общем-то, достаточно малоизвестную информацию о том, что именно пошло не так.Это что-то значит для вас, редко что-то большее, чем «о, чёрт», для пользователя.Нажатие кнопки «Продолжить», как правило, не является правильным решением.

Чтобы пользователь не мог сделать такой сложный выбор, вызовите Application.SetUnhandledExceptionMode () в методе Main (), передав ThrowException, чтобы событиеникогда не поднимаетсяКаждое необработанное исключение теперь проходит через AppDomain.UnhandledException.Включая те, которые были созданы в рабочем потоке, исключения, которые не создают диалог.Напишите обработчик события для него и отобразите и / или зарегистрируйте значение e.ExceptionObject.ToString ().Вы сами должны выбрать способ передачи этой информации на свой рабочий стол или ИТ-персоналу пользователя, чтобы вы могли улучшить свой продукт и обеспечить стабильность своих машин.

2 голосов
/ 01 ноября 2010

Вы должны обработать оба следующих события:

AppDomain.CurrentDomain.UnhandledException 
Application.ThreadException

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

2 голосов
/ 01 ноября 2010

Вы можете обработать событие System.Windows.Forms.Application.ThreadException , чтобы показать ваше пользовательское сообщение.

0 голосов
/ 01 ноября 2010

Проверить эту ссылку.

Со страницы:

Введение

Одна из вещей, которая произвела на меня впечатление, когдаЯ впервые начал изучать .NET - его расширенную функциональность обработки исключений.Под этим я подразумеваю такие функции, как легкий доступ к типу создаваемых исключений, трассировке полного стека и внутренним исключениям.Это позволяет легко получать полную информацию в тех местах, где вы просто ловите исключение System.Exception верхнего уровня.Я считаю это удобным, так как, если вам не нужно предпринимать определенные действия с определенным типом исключения, утомительно иметь последовательные обработчики перехвата для каждого типа исключения, которое может быть сгенерировано.В любом случае, даже если вы перехватываете конкретные исключения, вам, как правило, также нужно перехватывать System.Exception, чтобы скрыть себя и предотвратить сбои программы.Таким образом, я обнаружил, что в моем коде все время ловится System.Exception.Типичный сценарий состоит в том, что в приложениях Windows Forms и ASP.NET Web Forms все мои нетривиальные обработчики событий заканчиваются тем, что содержат блоки try-catch System.Exception.код несколько и не совсем кажется правильным.Есть ли лучший способ?

0 голосов
/ 01 ноября 2010

В веб-формах вы можете обрабатывать Application_Error в global.asax. Но похоже, что вы говорите о winforms. В этом случае:
попробуйте добавить следующий код в основной метод запуска:

Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(ExceptionHandler.OnThreadException);  

И определить класс ExceptionHandler следующим образом:

/// <summary>
/// Main thread error handler.
/// </summary>
public sealed class ExceptionHandler
{
    private ExceptionHandler()
    {}

    /// <summary>
    /// Handles an exception on the main thread.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="t"></param>
    public static void OnThreadException(object sender, ThreadExceptionEventArgs t) 
    {
        DialogResult result = DialogResult.Cancel;
        try
        {
            result = ShowThreadExceptionDialog(t.Exception);
        }
        catch
        {
            try
            {
                MessageBox.Show("Fatal Error", "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                Application.Exit();
            }
        }

        // Exits the program when the user clicks Abort.
        if (result == DialogResult.Abort) 
            Application.Exit();
    }

    // Creates the error message and displays it.
    private static DialogResult ShowThreadExceptionDialog(Exception e) 
    {
        string errorMsg = "An error occurred please contact the adminstrator with the following information:\n\n";
        errorMsg = errorMsg + e.Message + "\n\nStack Trace:\n" + e.StackTrace;
        return MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
    }
}

взято из: http://www.eggheadcafe.com/community/aspnet/2/27469/any-method-for-handling-error-globally-in-c.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...