Обработка статических исключений конструктора в многопоточном приложении - PullRequest
1 голос
/ 21 сентября 2009

У меня есть статический класс, который создает несколько рабочих потоков в своем конструкторе. Если исключение возникает до того, как рабочие были созданы, мой обработчик Application.ThreadException (используется для закрытия приложения, если возникает ошибка, о которой известно, что она не может быть исправлена) срабатывает нормально, и все в порядке. Однако после создания первого рабочего потока в дополнение к запуску обработчика появляется сообщение «MYAPP столкнулся с проблемой и должен быть закрыт. Приносим извинения за неудобства». диалог для сообщения об ошибках MS.

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

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

class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
        try
        {
            Application.Run(theForm);
            theForm.Dispose();

        }
        catch (Exception e)
        {
            //doing this to use the same handler here and for Application.ThreadException
            ThreadExceptionEventArgs argsEx = new ThreadExceptionEventArgs(e);
            FatalExceptionHandler(null, argsEx);

        }
        finally
        {
            MyStaticClass.KillThreads();
        }
    }

    public static void FatalExceptionHandler(object sender, System.Threading.ThreadExceptionEventArgs ex)
    {
        Exception e = ex.Exception;
        try
        {
            //lots of stuff to give more useful error messages for known problems
            //and display them in a messagebox.
        }
        // if anything went wrong scraping the exception text for formatting, show the raw value.
        catch
        {
            MessageBox.Show(e.Message);
            return;
        }
        // after showing the MessageBox, close out the app.
        finally
        {
            System.Environment.Exit(1);
        }
    }
}

class MyStaticClass
{
    static MyStaticClass()
    {
        myThread = new Thread(new ThreadStart(SomeMethod));

        //if this exception is thrown everything works normally
        //Throw new Exception("KABOOM");

        myThread.Start();

        //if this exception is thrown a windows error reporting dialog appears 
        //along with the messagebox from program.FatalExcetion handlder             
        //Throw new Exception("KABOOM");
    }


    public void KillThreads()
    {
        //clean up the worker threads
    }
}

Ответы [ 2 ]

4 голосов
/ 21 сентября 2009

Статические конструкторы не вызываются в определенное время при запуске приложения. В частности, если вы никогда не ссылаетесь на MyStaticClass из другого класса, он может никогда не инициализироваться. Поскольку вы не можете рассуждать об этом каким-либо разумным способом, вы должны предоставить метод StaticInitialize() (или аналогичный) для типов с нетривиальным кодом в статическом конструкторе, а также в случаях, когда статический код инициализации действительно должен выполняться. Переместите код из статического конструктора в метод статической инициализации.

1 голос
/ 21 сентября 2009

Application.ThreadException вызывается только для необработанных исключений потока пользовательского интерфейса (поскольку является частью класса Application). Событие необработанного исключения рабочего потока: AppDomain.UnhandledException. Когда происходит необработанное исключение в рабочем потоке, это событие возникает, а затем отображается диалоговое окно сбоя системы. AppDomain.UnhandledException предназначен только для целей ведения журнала, и не существует документированного способа предотвратить отображение диалогового окна ошибки сбоя системы.

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