Перехват всех сбоев в C # .NET - PullRequest
3 голосов
/ 31 июля 2011

В этой теме уже есть несколько довольно хороших тем о переполнении стека, но на самом деле, кажется, нет однозначного ответа ни на одну из них. Мое консольное приложение C # (работающее как служба Windows) запускает процесс Java и управляет им (запускает / останавливает / перезапускает), но моя проблема в том, что я удаленно подключаюсь к компьютерам и вижу, что иногда он запускает около 20 процессов Java.

Это, очевидно, проблема, связанная с тем, что мое приложение в какой-то момент перестало работать, а не закрывало запущенный Java-процесс. Я подключил «UnhandledExceptionEventHandler» в AppDomain.CurrentDomain, и я вызываю TerminateProcess () из него (закрывает активный процесс Java), но эта проблема все еще возникает в отдельных случаях.

Мое приложение имеет основной поток, серверный поток TCP (который принимает асинхронные подключения) и серверный поток UDP. Есть ли еще что-то, что я должен подключить поверх UnhandledException?

EDIT

Мне также пришло в голову, что в моем коде есть несколько блоков Try / Catch, которые просто пишут в консоль, чего я никогда не вижу. Должен ли я просто удалить их, чтобы они попадали в исключение UnhandledException, или вместо этого добавить туда регистратор?

Ответы [ 2 ]

1 голос
/ 31 июля 2011

Прежде всего вам нужно изменить Console.WriteLine.. строки в вашем коде на Debug.WriteLine.., если вы не хотите регистрироваться, поэтому его вывод будет только при отладке.

Во-вторых, когда возникает какое-либо исключение, если вы не знаете, как его обработать или исправить, затем сбросьте его catch { throw; } после регистрации. Я лично делаю

try
{
    ...
}
catch (Exception exception)
{
    Log(exceptiosn);//log it first or Debug.WriteLine...
#if DEBUG
    System.Diagnostics.Debugger.Break();//break at the debugger here.
#endif//DEBUG
    throw;
} 

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

0 голосов
/ 31 июля 2011

Нужно учитывать, хотите ли вы, чтобы приложение .NET отвечало за порожденные процессы. Если возможно, они могут быть ответственны за выключение, когда больше не получают вход. Если порожденные процессы выполняются на других машинах, я все равно попытался бы это сделать, поскольку проблемы с сетью могут помешать отправке сообщения о завершении работы из приложения .NET в процессы Java. У каждого свои обязанности.

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

...