Как мне продолжить работать после необработанного исключения? - PullRequest
1 голос
/ 18 октября 2011

У меня есть следующий код в моем приложении, которое выполняется после необработанного исключения:

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            var exception = e.ExceptionObject as Exception;
            if (exception != null) MessageBox.Show(exception.Message + " - " + exception.StackTrace);
        }

, но даже если я улавливаю необработанное исключение, мое приложение для Windows Mobile закрывается.Как предотвратить закрытие приложения, когда я ловлю необработанное исключение.Я никогда не хочу закрывать свое приложение.Я хочу открыть форму входа в этом сценарии или что-либо еще, не закрывающее приложение.

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

Я могуне использовать try catch в каждом коде ....

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

Ответы [ 5 ]

6 голосов
/ 19 октября 2011

Ты не.Когда вы получаете необработанное исключение AppDomain, ваше приложение больше не находится в стабильном состоянии.Куда именно вы бы возобновили?Когда вы дойдете до этого момента, ваш единственный выход с веской причиной - это выйти.Вы могли бы разумно запланировать себя для повторного запуска, чтобы убедиться, что приложение возвращается, но гораздо лучшая идея состоит в том, чтобы фактически обработать исключение в его источнике и предотвратить его исключение UnhandledException.

4 голосов
/ 12 марта 2013

В вашем app.config добавьте следующий элемент

<runtime>
  <!-- the following setting prevents the host from closing when an unhandled exception is thrown -->
  <legacyUnhandledExceptionPolicy enabled="1" />
</runtime>
2 голосов
/ 19 октября 2011

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

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

if (myByteArray != null)
{
    myIPAddress = new IPAddress(myByteArray);
}

, потому что таким образом конструктор IPAddress не будет выбрасывать ArgumentNullException.

Однако в большинстве случаев это невозможно сделать, особенно в сетипотому что вы не можете предсказать, будет ли обрезан кабель, будет ли потерян сигнал, произойдет сбой сервера базы данных и т. д. в середине транзакции.Поэтому вам следует try...catch каждый раз, когда вы подключаетесь к сети или отправляете данные или получаете данные из подключения.

1 голос
/ 22 апреля 2015

AppDomain.CurrentDomain.UnhandledException запускает любое необработанное исключение в любом потоке, но начиная с CLR 2.0, CLR принудительно завершает работу приложения после завершения обработчика событий.Однако вы можете предотвратить завершение работы, добавив в файл конфигурации приложения следующее:

<configuration>
  <runtime>
    <legacyUnhandledExceptionPolicy enabled="1" />
  </runtime>
</configuration>
0 голосов
/ 18 октября 2011

Я думаю, вам нужно использовать Application.ThreadException Когда вы подписываетесь на Application.ThreadException , необработанные исключения не попадут на UnhandledException , и приложение продолжит работу.

...