다음 상황을 가정하십시오. 양식에는 클릭시 배경 작업자가 시작하는 버튼이 있습니다. 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에서 제공하는 멋진 디버깅 기능을 모두 사용할 수 있습니다.
'TargetInvocationException'의 경우'InnerException' 속성은 기본 예외를 가지고 있습니다. – Damith
@Damith 내가 아는 것은 내가 구하는 것이 아니다. 나는 이런 종류의 대답을 막기 위해 질문을 편집했다. –