2010-06-16 4 views
21

업데이트 : 마이크로 소프트 연결에 버그 리포트 제출 한 : 당신이 당신의 컴퓨터에서이 문제를 재현 할 수있는 경우가 고정 될 수 있도록 https://connect.microsoft.com/VisualStudio/feedback/details/568271/debugger-halting-on-exception-thrown-inside-methodinfo-invoke#detailscatch 할 수없는 예외, PT 2

, 버그를 찬성 투표하십시오!


좋아, 나는 몇 가지 테스트를 해봤 내가 아주 간단한 뭔가 문제를 감소했습니다

난. 예외를 throw하는 새 클래스에 메서드를 만듭니다.

public class Class1 { 
    public void CallMe() { 
     string blah = null; 
     blah.ToLower(); 
    } 
} 

ii. 이 메서드를 다른 위치로 가리키는 MethodInfo를 만듭니다.

Type class1 = typeof(Class1); 
Class1 obj = new Class1(); 
MethodInfo method = class1.GetMethod("CallMe"); 

iii. try/catch 블록에서 Invoke()에 대한 호출을 마무리하십시오.

try { 
    method.Invoke(obj, null); // exception is not being caught! 
} catch { 
} 

iv. 디버거없이 프로그램을 실행하십시오 (잘 작동합니다).

v. 이제 디버거를 사용하여 프로그램을 실행하십시오. 디버거는 예외를 발생시키는 catch 처리기에서 래핑되었지만 예외가 발생하면 프로그램을 중지합니다. catch 블록에 중단 점을 넣더라도 도달 할 때까지 중단됩니다!

사실 디버거없이 실행하면 예외가 발생합니다. 간단한 테스트 프로젝트에서는 다른 레벨에서는 무시되지만 앱에 모든 종류의 전역 예외 처리가있는 경우 해당 예외도 트리거됩니다. [코멘트를보십시오]

이것은 디버깅을 시도하는 고통은 말할 것도없고 내 응용 프로그램의 크래시 핸들러를 계속 실행하기 때문에 두통이 생깁니다.

+7

+1 당신이 제정신 예에이를 줄일 수있는 시간이 걸렸 원인 –

+0

여기를 참조하십시오 : http://stackoverflow.com/questions/2724703/why-does-vs2010-always-break-on-exception-from-methodinfo-invoke –

+4

Visual Studio에서 '스톱 할 때 중지'로 예외를 사용하도록 설정 했습니까? 이 동작은 디버그 | 예외로 이동하고 throw에서 중지를 선택 해제하십시오. –

답변

5

.NET 4 상자에서이를 재현 할 수 있습니다. .NET 4.0에서만 발생합니다.

이것은 나에게 버그와 매우 흡사하며 MS Connect를 사용해야합니다. Major 크래시 핸들러가 걸려 넘어지면 불량합니다. 이 문제를 해결할 수있는 좋은 방법이 아닌 것처럼 들리는 것은 호출 된 메서드를 자체 처리기로 래핑하는 것입니다. :-(

것은 비록, 충돌 핸들러를 트립되고, 재현 할 수 없습니다 여기 내 프로그램입니다 :..

namespace trash { 
    public class Class1 { 
     public void CallMe() { 
      string blah = null; 
      blah.ToLower(); 
     } 
    } 

    class Program { 
     static void Main(string[] args) { 
      AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);   
      var class1 = typeof(Class1); 
      var method = class1.GetMethod("CallMe"); 

      try { 
       var obj = new Class1(); 
       method.Invoke(obj, null); // exception is not being caught! 
      } 
      catch (System.Reflection.TargetInvocationException) { 
       Console.Write("what you would expect"); 
      } 

     } 

     static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { 
      Console.Write("it would be horrible if this got tripped but it doesn't!"); 
     } 
    } 
} 
+0

아직 테스트 애플 리케이션에서 트립하고있는 크래시 핸들러를 재현 할 수 없었지만 아직 해결 중입니다. 어떤 이유로 내 실제 응용 프로그램이 꽤 열심히 죽어 가고 예외 (로그 파일에 인쇄)가 매우 비슷해 보입니다. – devios1

+0

그러나 뭔가 흥미로운 것을 발견했습니다. WPF에서 예외를 throw하는 속성에 바인딩하면 디버거가 실행될 때 중단됩니다. MethodInfo.Invoke를 호출 할 필요도 없습니다! 디버거 모드가 아닐 때 크래시 핸들러가 작동하지 않는 것은 잘못된 것 같습니다. 다른 문제가 발생했기 때문입니다. 이는 VS2010 버그 일 수 있음을 의미합니다. – devios1

+0

이 답변은 내가 얻은 결과와 같습니다. 기본적으로'Invoke' 안에 어딘가에 catch-all이 있는데, 나는 그들이 심각하게 후회한다고 생각합니다. 그러나 그것은 두통의 끝이 없습니다. NB. UnhandledException 핸들러가 실행될 때 Windows의 버전에 달려 있다고 나는 믿는다! XP/Vista/7에서 다른 결과를 얻을 수 있습니다. 내 테스트는 7이고 UnhandledException 이벤트는 발생하지 않지만 디버거에서는 중단됩니다. –

-1

모든 예외를 catch 할 수 없습니다. 당신의 예에는 몇 가지 가정이 있습니다. 예를 들어, 호출 스레드에서 예외가 발생했다고 가정합니다. 처리되지 않은 예외를 다른 스레드에서 잡는 것은 사용중인 런타임 (콘솔, winforms, WPF, ASP.Net 등)에 따라 다릅니다.

또한 System.Environment.FailFast()를 호출해도 처리 할 수있는 조건이 생성되지 않으므로 프로세스가 실제로 개입 할 기회없이 종료됩니다.

+0

그는 BeginInvoke()가 아닌 Invoke()를 호출하므로 현재 스레드에서 호출이 발생합니다. 호출이 완료되면 호출 사이에 들어오는 외부 코드가 있습니다. –

+0

@Dave. 그러나 문제의 호출 된 메서드가 다른 스레드를 만들지 않는다고 보장 할 수는 없습니다. 위의 주장이 성립합니다. –

+0

@Dave, 즉, Invoke에 의해 호출 된 메소드는 (직접적으로 또는 간접적으로) 쓰레드를 생성 할 수 있으며, Invoke 자체가 임의로 다른 쓰레드를 생성한다는 것을 의미하지는 않습니다. –

관련 문제