2009-09-14 2 views
28

스크립트 (nant)에서 실행하려는 C#/.NET으로 작성된 콘솔 응용 프로그램이 있습니다. 콘솔 응용 프로그램에서 예외가 발생하면 계속 진행하지만 Windows Vista에서는 솔루션을 검색하고 디버그를 묻는 팝업이 나타납니다.C#/NET에서 "program stopped working"을 피하십시오

"프로그램 작동이 중지되었습니다. "콘솔 응용 프로그램에서 예외가 발생할 때. C#/.NET에서 어떻게 제어 할 수 있습니까?

는 (A 비슷한 질문이 the issue for the C language를 해결,하지만 난 C#을 /를위한 솔루션을 원하는 NET을..)

이 (명확히하기 위해 : 나는 예외가 팝업없이 을 NANT에 전달되지만 싶습니다.)

답변

40

JIT 디버거 팝업은 처리되지 않은 예외가있을 때 발생합니다. 즉, 예외가 스택의 모든 경로를 런타임의 모든 스레드의 루트로 터널합니다.

이 문제를 방지하려면 AppDomain.CurrentDomain.UnhandledException 이벤트를 처리하고 Environment.Exit(1)으로 전화를 걸어 정상적으로 종료하십시오.

이렇게하면 AppDomain 내의 모든 스레드에서 모든 예외가 처리됩니다. (

AppDomain.CurrentDomain.UnhandledException += (sender, args) => 
{ 
    Console.Error.WriteLine("Unhandled exception: " + args.ExceptionObject); 
    Environment.Exit(1); 
}; 

당신은 아마도이 경우에 오류를 기록 할은 NAnt 로거를 사용한다 : 당신은 특별한 아무것도하지 않는 한 앱은 아마 단지 그래서 당신의 public static void Main 방법이 퍼팅이 충분해야, 하나의 AppDomain을 가지고 그래도이 API를 다시 호출 할 수는 없습니다.)

컴퓨터에서 disable JIT debugging이 될 수도 있습니다. 필자는 전용 빌드 서버와 같은 특정 상황에서만이 방법을 권장합니다.

+1

당신은 디버깅을 죽이기 전에 당신이 release-mode에 있는지 물어보아야합니다. – Andreas

+0

왜'args.ExceptionObject'가'Exception'이 아닌가? 캐스팅하는 것이 안전한가요? – Winter

+0

@Winter 좋은 질문입니다. 나는'as' 캐스트를 사용하고'null' 자신을 확인합니다. –

1

그냥 예외를 잡아 로그/무시하십시오.

+0

예, 팝업을 피할 수 있지만 장점을 피할 수 있습니다. 이 프로그램을 호출하는 다른 프로그램을 사용하면 예외가 발생했음을 알 수 있습니다. 수락 된 답변을 참조하십시오. –

+0

catch 블록에서 Environment.Exit을 호출 할 수 있습니다. – maciejkow

0

일반적으로 앱에서 예외를 처리하지 않는 경우에만 발생합니다. try/catch bblock에 전체 콘솔 앱을 래핑하고 실패 코드를 다시 전달하면이를 피할 수 있습니다.

1

처리되지 않은 예외로 인해 팝업이 나타납니다. 이를 방지하려면 기본 메소드가 모든 예외를 포착하여 다른 유용한 정보로 변환하여 가져올 수 있습니다. 예외를 무시하는 것은 좋지 않습니다.

Btw 예외는 스레드 당이므로 스레드가 스레드를 생성하거나 스레드 풀 스레드를 사용하는 경우 예외 처리기가 필요합니다.

1

Windows Vista에서는 프로그램에 대해이 대화 상자를 사용하지 않도록 설정할 수 있습니다.

"문제점 보고서 및 솔루션 기능"을 비활성화하십시오. 제어판 -> 문제 보고서 및 솔루션 -> 설정 변경 -> 고급 설정 -> 내 프로그램, 문제보고 해제로 이동하십시오.

+0

예, 내 컴퓨터에이 프로그램을 설치하면 가능하지만 프로그램에 구워서 다른 컴퓨터에서도 일관되게 작동하도록하고 싶습니다. (대답을 참조하십시오.) –

+1

나는 이것을 Windows 10에서 할 수 있습니까? – zsf222