2012-11-15 3 views
6

Possible Duplicate:
VS2010 does not show unhandled exception message in a WinForms Application on a 64-bit version of WindowsVS 2012 (VB.net)는 64 비트

방금 ​​설치 한 Windows 7에서 처리되지 않은 예외를 무시하고 VS2012를 사용하기 시작한다. 전에 VS2008 Express를 사용하고있었습니다. VS2012는 Win 7 64 비트에서 실행됩니다. (이전의 dev 환경은 XP 32 비트였습니다).

지금까지 기본 연구 프로젝트 (WinForms, VB)를 사용하여 VS에서 처리되지 않은 예외를 무시하고 있음을 알았습니다. 이 의 마지막 줄은 예외의 원인이해야

A first chance exception of type 'System.IndexOutOfRangeException' occurred in System.Data.dll 

을하지만 코드는 실행에 전달 : 충분한

With cmd 
.Connection = sqlConn 
.CommandType = CommandType.StoredProcedure 
.CommandText = "NameOfStoredProcedure" 
.Parameters.Add("@TheParameterName", SqlDbType.Int, -1) 
.Parameters("@TheParameterNameWithATypo").Direction = ParameterDirection.ReturnValue 

물론을 직접 실행 창을 보여줍니다!

디버그/예외 대화 상자에는 모든 예외 유형에 대해 "Throw"및 "User-Unhandled"체크 상자가 있습니다. "User-Unhandled"가 모두 체크됩니다. 예외를 처리하고 예외 처리를 중단하고 싶지 않기 때문에 "Thrown"에 체크하고 싶지 않습니다. (지금 당장은 아무 것도 시도하지 않습니다 ... 블록을 모두 잡아라. - 그러나 디버거는 마치 전체 프로젝트가 하나에 들어있는 것처럼 행동합니다.)

모든 옵션 등을 살펴 봤지만 "예외시 예외 설정"옵션을 찾을 수는 없습니다. 그것은 내 코드가 아니기 때문에 내가 도움을 찾고있다. 필자가 필연적으로 내릴 수있는 어리석은 실수를 탐지하기 위해 디버거를 믿을 수 없다.

다른 사람이이 문제에 부딪 쳤던 또 다른 question을 발견했습니다. 문제는 Win64에서 발생하는 것으로 보입니다. 하지만 VS는 Win64에서 실제로 사용할 수 없습니까? 나는 꽤 믿을 수는 없지만 처리되지 않은 예외를 깨지 않으면 효과적으로 사용할 수 없게됩니다.

편집 : 모든 의견을 제공해 주셔서 감사합니다. 나는 Neolisk의 솔루션을 시도했지만 두 핸들러의 서명이 다르기 때문에 약간 코드를 변경했다 :

Public Sub Main() 
    AddHandler Application.ThreadException, AddressOf ThreadExceptionHandler 
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException) 
    AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledExceptionHandler 

    Form1.Show() 
End Sub 

Friend Sub ThreadExceptionHandler(sender As Object, e As System.Threading.ThreadExceptionEventArgs) 

End Sub 

Friend Sub UnhandledExceptionhandler(sender As Object, E As System.UnhandledExceptionEventArgs) 
End Sub 

이 근무 - 감사합니다! 하지만 응용 프로그램 프레임 워크를 사용하지 않도록 설정해야합니다. 그렇지 않으면 응용 프로그램이 Sub Main을 시작으로 사용할 수 없습니다. 그리고 TBH 나는 .NET 초보자가 너무 많아 그 효과/장점/단점이 무엇인지 확실히 알지 못합니다. 내가 제공 한 모든 링크를 읽고 무슨 일이 벌어 지지만 피할 수 있으면 참여하고 싶지 않습니다 ...

KB976038에 핫픽스를 적용하면 저에게 효과적입니다. . 디버그 모드에서 예외를 발생시키고 Form_Load 이벤트를 실행하는 코드가 예상대로 실행됩니다. 이것은 응용 프로그램 프레임 워크를 사용할 수 있고 Form1을 시작 개체로 사용하며 위 코드는 주석 처리되어 있습니다.

EDIT2 : 아니요, 해당 핫픽스가 작동하지 않습니다. 원래의 "잘못된 매개 변수 이름"행으로 인해 코드가 예외로 중지되었습니다. 그러나 바로이 오류 상자를 야기 DBNull-> INT32 변환을 제외하고 후속 라인 (없이 디버깅 가능성) : 정말 모든 의견을 주셔서 감사합니다

vshost.exe - Application Error INTERNAL ERROR: Unhandled exception in Debugger::HandleIPCEvent. Event ID=0x246 Exception code=0x0000005, Eip=0x70d58101. Process ID=0xbec (3052), Thread ID=0xb1c (2844).

는 -하지만 내 마음이는 계약 위반은 다음과 같습니다 방법 개발자가 예외를 디버깅 할 수 있다고 믿을 수없는 경우 VS를 사용할 수 있습니까?Sub Main으로 시작해서 뭔가를 개발할 때마다 다음과 같은 특별한 라인을 넣는 것을 기억하지 않아야합니다. Form_Load에서 코드를 사용할 수 없다는 것을 기억하십니까? Win7 64 비트를 개발 OS로 사용하지 말 것을 권장합니다.

+0

Win7 64bit에서 VS 2012를 사용합니다. 제 예외는 정상적으로 작동합니다. 그러나 대상으로하는 .Net 프레임 워크의 버전을 변경해보십시오. 최신 버전을 사용해보십시오. 디버거가 다른 프레임 워크를 디버깅 한 다음 프로젝트가 실행중인 경우이 문제가 발생할 수있는 인스턴스에 대해 읽었습니다. – Kratz

+0

@HansPassant : 동일한 원인, 다른 시작 조건. OP가 VS 2012를 사용 중입니다. – Neolisk

+1

맞아요, VS2012에서 수정되지 않았습니다. VS2021에서도 수정되지 않습니다. 바라건대 우리는 그때까지는 더 이상 걱정할 필요가 없기를 바랍니다. –

답변

3

당신이 코드를 에 가지고 있다고 생각합니다. 이 경우 여기에 내 질문을보십시오 : Explain critical bug in Visual Studio 2010 and up, WinForms and WPF. 이는 알려진 문제입니다. 코드를 밖으로 두거나 응용 프로그램을 Sub Main에서 시작하고 C#에서 이미 발견 한 3 개의 마법 선을 넣어야합니다. 여기 VB.NET에 대해 같은 3 선입니다 :

AddHandler Application.ThreadException, AddressOf YourExceptionHandler 
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException) 
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf YourExceptionHandler 

는 지금까지 내가 기억하는 첫 번째 줄은 실제로이 문제를 해결, 다른 2 다른 신비 오류를 포함한다. 프로그램을 시작하자마자 안전을 위해 항상 모든 것을 포함시키는 것은 상처가되지 않습니다. YourExceptionHandler은 비어있는 방법이 될 수 있습니다. 이 세 줄을 추가하면 Exception catching이 예상대로 작동하기 시작해야합니다.

+0

고마워! 나는 지금 이런 종류의 깊이를 파고 들지 않기를 바랐다. 이 약간 다른 코드를 모듈의 Sub Main에 추가해야했습니다. – sebt

관련 문제