it-swarm-ko.tech

.NET 앱에서 모든 예외 / 충돌을 잡는 방법

가능한 중복 :
. NET-“Catch all exceptions handler”를 구현하는 가장 좋은 방법은 무엇입니까?

충돌하고 사용자에게 메시지를 표시하는 .NET 콘솔 앱 앱이 있습니다. 모든 코드가 try{<code>} catch(Exception e){<stuff>} 블록에 있지만 여전히 오류가 표시됩니다.

Win32 앱에서 다양한 예외 처리기를 설치하여 가능한 모든 예외/충돌을 캡처 할 수 있습니다.

/* C++ exc handlers */
_set_se_translator
SetUnhandledExceptionFilter
_set_purecall_handler
set_terminate
set_unexpected
_set_invalid_parameter_handler

가능한 모든 오류 사례를 처리/기록/조용한 작업을 수행 할 수 있도록 .NET 세계에서 동등한 기능은 무엇입니까?

39
DougN

다른 사람들이 게시 한 내용과 달리 모든 예외를 잡는 데 아무런 문제가 없습니다. 중요한 것은 그것들을 모두 적절하게 처리하는 것입니다. 스택 오버플로 또는 메모리 부족 상태가 발생하면 앱이 종료되어야합니다. 또한 OOM 조건으로 인해 예외 처리기가 올바르게 실행되지 않을 수 있습니다. 예를 들어, 예외 처리기가 예외 메시지와 함께 대화 상자를 표시하는 경우 메모리가 부족하면 대화 상자 표시를위한 공간이 충분하지 않을 수 있습니다. 기록하고 즉시 종료하는 것이 가장 좋습니다.

다른 사람들이 언급했듯이, UnhandledException 및 ThreadException 이벤트는 그렇지 않으면 놓칠 수있는 수집 예외를 처리 할 수 ​​있습니다. 그런 다음 메인 루프 주위에 예외 처리기를 던지십시오 (winforms 앱이라고 가정).

또한 OutOfMemoryExceptions가 항상 메모리 부족 조건에서 발생하는 것은 아닙니다. OOM 조건은 실제 기본 조건이 메모리 부족이라는 사실과 반드시 ​​관련이없는 모든 종류의 예외, 코드 또는 프레임 워크를 트리거 할 수 있습니다. 근본적인 원인이 실제로 메모리가 부족할 때 InvalidOperationException 또는 ArgumentException이 자주 발생했습니다.

27
Pete Davis

AppDomain.UnhandledException 이벤트에 이벤트 핸들러를 추가 할 수 있으며 예외가 발생하고 포착되지 않으면 호출됩니다.

43
Juanma

호스트 Jeff Atwood의 코드 프로젝트에있는이 기사 사용자에게 충돌에 대한 정보를 표시하기위한 처리되지 않은 예외 및 최상의 실습을 포착하는 코드를 포함합니다.

11
Ricardo Amores

Global.asax 클래스는 마지막 방어선입니다. 보다:

protected void Application_Error(Object sender, EventArgs e)

방법

10
Drejc

어떤 예외는 잡기가 위험하거나 대부분 잡을 수 없다는 점에 유의하십시오.

  • OutOfMemoryException : catch 처리기에서 수행하는 모든 작업 (CLR의 관리 또는 관리되지 않는 쪽)에서 메모리를 할당하여 다른 OOM을 트리거 할 수 있습니다.
  • StackOverflowException : CLR에서 조기 감지 여부에 따라 알림을받을 수 있습니다. 최악의 시나리오는 단순히 프로세스를 중단시킵니다.
6
Peli

제대로 처리 할 계획이없는 all 예외를 잡는 것은 확실히 나쁜 습관이지만, 응용 프로그램이 어떤 방식 으로든 실패해야한다고 생각합니다. 충돌로 인해 사용자가 죽을 염려가 없어야하며 최소한 오류에 대한 설명, 기술 지원 부서에보고 할 정보 및 응용 프로그램을 닫고 다시 시작하는 단추가 표시되어야합니다. 이상적인 세계에서 응용 프로그램은 사용자 데이터를 디스크에 덤프 한 다음 복구하려고 시도해야합니다 (그러나 이것이 너무 많이 요구되는 것을 알았습니다).

어쨌든, 나는 보통 다음을 사용합니다.

AppDomain.CurrentDomain.UnhandledException
4
Dario Solera

AppDomain.CurrentDomain.UnhandledException을 사용하여 이벤트를 얻을 수 있습니다.

4
Mendelt

Application.ThreadException 이벤트와 함께 갈 수도 있습니다.

COM 기반 응용 프로그램 내에서 실행되는 .NET 응용 프로그램을 개발할 때; 이 경우 AppDomain.CurrentDomain.UnhandledException이 작동하지 않았으므로이 이벤트는 매우 유용했습니다.

3
petr k.

나는 모든 예외를 잡아야하는 것이 아니라 사용자에게 더 잘 보이도록해야한다고 생각합니다. 그 이유는 실제로 처리 할 수있는 예외 만 잡아야하기 때문입니다. 예외가 발생하여 프로그램이 중지되었지만 여전히 발견되면 훨씬 심각한 문제가 발생할 수 있습니다. FAQ : FxCop이 catch (Exception)에 대해 경고하는 이유는 무엇입니까? 도 참조하십시오.

1
hangy

이러한 처리되지 않은 예외를 발견하면 응용 프로그램의 보안 요구 사항이 변경 될 수 있습니다. 특정 상황 (네트워크 공유 등에서 실행할 때)에서 응용 프로그램이 제대로 실행되지 않을 수 있습니다. 철저히 테스트하십시오.

1
Johnny Bravado

appDomain.CurrentDomain.UnhandledException Application.ThreadException을 모두 사용하는 것은 아프지 않습니다.

그러나 2 차 스레드의 예외는 이러한 핸들러에서 포착되지 않습니다. 필요한 경우 보조 스레드에 SafeThread 사용

0
Steven A. Lowe