2012-05-28 4 views
3

다음 상황을 가정하십시오. 양식에는 클릭시 배경 작업자가 시작하는 버튼이 있습니다. RunWorkerCompleted 이벤트 처리기에는 처리되지 않은 예외를 throw하는 코드가 있습니다. 이 양식은 Application.Run 메소드에서 시작됩니다.TargetInvocationException from BackgroundWorker_RunWorkerCompleted

public partial class FormMain : Form 
{ 
    public FormMain() 
    { 
     InitializeComponent(); 
    } 

    private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     throw new Exception(); 
    } 

    private void button_Click(object sender, EventArgs e) 
    { 
     backgroundWorker.RunWorkerAsync(); 
    } 
} 

문제는 대신에 Application.Run 호출에서 Visual Studio를 나누기 FormMain.backgroundWorker_RunWorkerCompleted의 방법 ") 새로운 예외 (던져"는 것이다. 그 위에는 실제 예외가 TargetInvocationException으로 래핑되고 호출 스택이 Program.Main 메소드로 축소되고 예외로 인해 발생 된 코드를 검사 할 수 없습니다.

어떻게 포장하는 것을 막으시겠습니까? 본질적으로 잘못된 것을하고 있습니까?

TargetInvocationException과 함께 제공되는 호출 스택에서 판단 할 때, 메시지 루프에 대한 기본적인 이해와 스레딩에 대한 기본적인 이해를하기에는 너무 많은 호출 메소드가 스택되어 있습니다.

EDIT : TargetInvocationException에 InnerException 속성이 있으며 거기를 보면 오류를 추적 할 수 있지만 그 점은 궁금하지 않습니다. 문제는 TargetInvocationException을 사용하여 실제 예외를 래핑하기 전에 Visal Studio를 중지하는 방법입니다. 따라서 VS IDE에서 제공하는 멋진 디버깅 기능을 모두 사용할 수 있습니다.

+0

'TargetInvocationException'의 경우'InnerException' 속성은 기본 예외를 가지고 있습니다. – Damith

+0

@Damith 내가 아는 것은 내가 구하는 것이 아니다. 나는 이런 종류의 대답을 막기 위해 질문을 편집했다. –

답변

3

예, 이것은 UI 스레드에서 RunWorkerCompleted 이벤트를 실행하는 마법의 부작용입니다. 디버거가 관련이 있지만 여전히 관련되어있는 프로그램의 마지막 문인 메시지 루프를 시작한 Application.Run() 호출을 표시 할 수 없도록 작성한 코드는 없습니다.

예외가 발생하면 디버거를 강제로 디버깅해야합니다. Debug + Exceptions에서 CLR 예외에 대해 Thrown 확인란을 선택하십시오. 또한 디버거없이 이것을 실행하면 행운의 휠 대화 상자가 나타납니다. Application.SetUnhandledExceptionMode()로이를 수정하십시오.

+0

던져진 예외를 모두 잡는 것은 처리 된 예외를 포함하여 모든 예외에 대해 IDE를 중지하는 불쾌한 결과를 초래합니다. Windows 메시지를 보내어 메인 스레드의 어딘가에 처리 할 수 ​​있다고 가정합니다. –

+0

예외적 인 경우에만 예외를 사용하십시오. 이미 "어딘가"가 있고 이미 메인 스레드에 있습니다. 메시지를 보낼 필요가 없습니다. RunWorkerCompleted 이벤트 처리기에서 처리하십시오. –

+0

사실, 나는 백그라운드 작업자가 완료 한 후에 간단한 로직을 수행해야하는 프로젝트를 진행하고 있습니다. 사전에 중복 키를 넣는 것 같이 사소한 일이있을 때 내부 예외 스택 추적을 파헤치는 것은 정말 짜증이납니다. 걱정하지 마라. "exception driven design"을 연습하지 마라. –