C # поймать любое выходящее исключение - PullRequest
4 голосов
/ 18 июля 2011

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

Ответы [ 7 ]

6 голосов
/ 18 июля 2011

Вы можете использовать AppDomain.CurrentDomain.UnhandledException событие, которое будет перехватывать все необработанные исключения.

Также проверьте этот поток для справки: .NET Глобальный обработчик исключений в консольном приложении

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

2 голосов
/ 18 июля 2011

Исключения "всплывают" в вызывающем методе, поэтому наличие блока try-catch в вашем Main методе достаточно, чтобы перехватить все.

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

2 голосов
/ 18 июля 2011

Перейдите к Отладка-> Исключения (Ctrl + D, E) и отметьте соответствующее Исключение, которое вы хотите обработать.Существует возможность разбить все исключения «Брошенные» и «Необработанные пользователем».

Возможно, вы захотите выбрать «Исключение общеязыковой среды выполнения», которое «Брошено» и «Необработано пользователем».Это будет прерывать выполнение в любое время, когда возникает исключение CLR.

Exception Dialog - VS 2008

См. Наиболее полезная функция VS, о которой никто не знает

1 голос
/ 18 июля 2011
AppDomain.CurrentDomain.UnhandledException += OnCurrentDomain_UnhandledException;

//in windows forms you need also to add these two lines
Application.ThreadException += OnApplication_ThreadException;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
1 голос
/ 18 июля 2011

Ознакомьтесь с API AppDomain.CurrentDomain.UnhandledException для создания глобального обработчика исключений приложения. И вот хороший пост в блоге о реализации / использовании его с C # и VB.

Также пересмотрите ваш подход к обработке исключений. Структурированная обработка исключений должна избавить вас от необходимости справляться с «ошибками повсюду», поскольку исключения автоматически просачиваются в стек вызовов. Это означает, что если вы правильно используете обработку исключений, то в вашем коде будет небольшое количество точек, где вы обрабатываете определенные исключения. Вы определенно не должны пытаться ловить везде, все время.

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

В консольном приложении вы можете просто обернуть основной цикл в Try Catch Block.Вы должны знать, что есть несколько исключений, которые приведут к завершению работы приложения без нажатия на этот блок.

Также сбой питания и установка Environment.FailFast в значение true будут игнорировать этот блок.

StackoverflowException MSDN документы (Вы можете поймать его, вы просто не должны знание здесь )

Environment.FailFast MSDN документы

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

try {} / catch {Exception} на вашем верхнем уровне поймает все, что выброшено снизу, до того, как это станет "неперехваченным исключением".

...