2011-09-16 2 views
0

내 .NET Windows Forms 앱에는 Application.ThreadException에서 처리기가 처리하는 예외를 throw 할 수있는 명령 함수를 호출하는 다양한 명령이 있습니다. 이 핸들러가 try/catch가없는 명령 함수의 경우에도 앱을 종료하지 않고 명령 기능을 종료하고 싶습니다. 이것을 얻는 가장 좋은 방법은 무엇입니까?현재 명령이나 WinForms 응용 프로그램을 종료하도록 스레드 예외를 어떻게 얻을 수 있습니까?

감사합니다.

답변

1

또 다른 제안은 (는 Cancelation을 지원하는)

+0

감사합니다.하지만 모든 명령 기능이 UI에 액세스해야하기 때문에 많은 코드 변경이 필요합니다. IIUC 작업은 허용되지 않습니다. – ChrisJJ

+0

@ChrisJJ IIUC가 무엇인지 잘 모르겠다. 왜 작업이 허용되지 않는지 설명 할 수 있습니까? – oleksii

+0

IIUC = 제대로 이해하면. 내 이해 작업에서 컨트롤에서 쓸 수 없습니다. 내가 잘못? – ChrisJJ

0

가장 간단한 방법은 "명령"을 각각의 try/catch 블록으로 래핑하는 것입니다.이 방법은 상당히 일반적인 방법으로 할 수 있습니다. 메시지 루프를 치기 전에 예외를 잡으십시오. 전 그래서 만약 당신이 있었다 :

public void ClickHandler(object sender, EventArgs e) 
{ 
    ExecuteCommand("foo"); 
} 

은 당신이 가진 것 :

public void ClickHandler(object sender, EventArgs e) 
{ 
    ExecuteInTryCatch(() => ExecuteCommand("foo")); 
} 

private static void ExecuteInTryCatch(Action action) 
{ 
    try 
    { 
     action(); 
    } 
    catch (Exception e) 
    { 
     // Log exception 
    } 
} 

그것은 모든 예외를 잡는 것은 일반적으로 좋은 생각이 아니다, 그러나, 주목할 가치가있다. 가능한 경우 매우 구체적인 예외를 잡으십시오.

+0

감사 Task 클래스를 사용하는 것입니다,하지만 요구 사항은 "심지어 어떤 시도/캐치가없는 명령 기능의 경우"를 포함하기 때문에 즉, 해결책이 아니다. 그리고 특정한 것보다 모든 예외를 잡는 이유는 어떤 특정 것들이 던져 질지 모른다는 것입니다. – ChrisJJ

+0

@ChrisJJ : * 그것은 해결책입니다. 왜냐하면 그것은 효과적으로 * try * catch를 갖도록 명령 함수를 감싸기 때문입니다. 이것이 당신의 요구를 충족시키지 못한다고 생각된다면, 당신이 필요로하는 것을 정확히 분명히해야합니다 - http://tinyurl.com/so-hints에서 질문을 명확하게하는 방법에 대한 제안을 읽으십시오. –

+0

@ChrisJJ try */catch *가없는 * 명령 기능이 ** 응용 프로그램 **이 종료해야하는 경우 * 변경할 수 없으며 기본 CLR 동작입니다. 그 이유는 응용 프로그램이 완전히 파괴 된 상태에 놓일 수 있다는 것입니다. 따라서 AppDomain (및 응용 프로그램 도메인이 하나의 도메인 인 경우 응용 프로그램)을 종료하는 것이 안전한 유일한 작업입니다. – oleksii

관련 문제