2017-02-17 4 views
1

다음 코드는 NullReferenceException을 생성하지만 (두 DebugRelease 모드에서) try 블록에 의해 체포되지 않습니다 강조예외가 잡히지 않는 이유는 무엇입니까?

using System; 

namespace ExceptionTest { 
    public class Program { 
     public static void Main(string[] args) { 
      String text = null; 
      try { 
       if (text.Equals("t1")) { 
        Console.WriteLine("r1"); 
       } else { 
        Console.WriteLine("r2"); 
       } 
      } catch(Exception ex) { 
       Console.WriteLine("Exception catched!"); 
      } 
     } 
    } 
} 

대신 프로그램 중단과 잘못된 라인 :

enter image description here

왜?

업데이트 : 스콧에 의해 제안 예외 텍스트 형 정보 : 예외 설정 아래에있는 예제 이미지에

System.NullReferenceException occurred 
    HResult=-2147467261 
    Message=Object reference not set to an instance of an object. 
    Source=ExceptionTest 
+9

당신은 * 아마도 * 디버거가 첫 번째 예외에 휴식을 구성했습니다. 디버거를 연결하지 않고이 프로그램을 실행하면 "예외가 발생했습니다"라는 메시지가 인쇄됩니까? – vcsjones

+0

또한'=='을 사용해 보았습니다. 만약'string.Equals (string) '과 다르게 예외를 던지는 것이 잘못 되었다면 – Andrew

+3

일반적인 예외를 잡는 것은 일반적으로 나쁜 습관입니다. 코드에서 스파 스 및 추적 할 수없는 동작으로 이어질 수 있습니다. 예외는 말할 것도없이 매우 비 효과적입니다. 변수가 null 일 수있는 경우 액세스하기 전에 null 값을 확인해야합니다. –

답변

3

: 체크 박스의 전원을 켭니다.

이렇게하면 null 참조 예외가 throw 될 때 중단되지 않습니다. 그리고 catch가 Exception을 catch합니다.

+1

해결책을 정확하게 지적한 첫 번째 답변이기 때문에이 대답을 올바른 것으로 선택했습니다. 고맙습니다! – salocinx

2

하면 비주얼 스튜디오 2015를 사용하는 경우 :

Debug-> 윈도우 -> 예외 설정

NullReferenceException이에 대한

검색을하고, 그 선택을 취소합니다. 이 상자는 당신이 그것을 캐치에 계속 볼 것입니다 계속 충돌하는 경우는, catch 블록에 도달하기 전에 디버거 휴식을하게

enter image description here

을 확인해야하기 때문에

3

그것은 발생합니다. 상자를 선택 취소하면 Debug -> Windows -> Exception Settings 드롭 다운 메뉴를 통해 '예외 설정'창 아래에서 다시 사용하도록 설정할 수 있습니다. "공용 언어 런타임 예외"절에는 NullRefrenceException 옵션이 포함되어 있습니다.

enter image description here

+0

자세한 답변을 보내 주셔서 감사합니다! – salocinx