[c#] 처리되지 않은 예외가 작동하지 않는 Visual Studio 2015 중단
Visual Studio에는 “Break on Un-handled exception”에 대한 특정 확인란이있었습니다. 2015 년에는 제거되었습니다 (또는 찾을 수없는 곳으로 옮겨졌습니다). 따라서 이제 사용자 수준 예외 처리기를 제공하지 않아도 변환 된 프로젝트가 더 이상 중단되지 않습니다. 특정 예외를 처리하기 때문에 모든 “발생 예외”를 중단하고 싶지 않습니다. 특정 핸들러를 제공하지 못하는 경우.
지금 내 코드는 단순히 현재 프로 시저를 종료하고 GOOD가 아닌 다음 호출 스택 위치에서 실행을 계속합니다.
누구나 Visual Studio 2015에서 이것을 다시 얻는 방법을 알고 있습니까? 어제 커뮤니티 에디션으로 업그레이드했습니다.
답변
디버깅을 시작할 때 기본적으로 오른쪽 아래 창에 나타나는 “예외 설정”이라는 새 창이 있습니다. 예상 할 수있는 모든 옵션이 있습니다.
CTRL+ ALT+로 가져올 수 있습니다.E
이를 통해 디버거에서 중단을 유발하는 예외를 선택할 수 있습니다.
그러나 핵심은 이러한 예외가 항상 중단되는지 또는 처리되지 않은 예외 일 때만 중단되는지 여부를 설정할 수도 있다는 것입니다. 그러나이를 설정하는 것은 그리 직관적이지 않습니다.
먼저 도구> 옵션> 디버깅에서 “내 코드 만 사용”을 선택해야합니다.
그러면 새 예외 설정 창에서 열 머리글 (Break When Thown)을 마우스 오른쪽 단추로 클릭하고 “추가 작업”열을 추가 할 수 있습니다. 그러면 각 예외를 “사용자 코드에서 처리되지 않은 경우 계속”으로 설정할 수 있습니다.
따라서 예외 또는 전체 그룹을 마우스 오른쪽 단추로 클릭하고 “사용자 코드에서 처리되지 않은 경우 계속”플래그를 비활성화하십시오. 안타깝게도 “추가 작업”열은 “사용자 코드에서 처리되지 않은 경우 중단”과 같은 빈 상태로 표시됩니다.
여기에 대한 자세한 내용 :
답변
답변
예외가 코드와 관련된 경우에만 중단하려는 Google 직원을 위해 Visual Studio 2015에는 옵션-> 디버깅-> 일반-> 내 코드 만있는 옵션이 있습니다. 확인되면 예외가 코드 외부에서 관리 (발생 및 포착) 될 때 중단되지 않도록합니다.
답변
Microsoft는 새 예외 창에서 논리를 미묘하게 변경했습니다.
http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/23/the-new-exception-settings-window-in-visual-studio-2015.aspx 참조
핵심 부분은 다음과 같습니다.
중요 사항
- 이 새 창에는 이전 모달 대화 상자와 동일한 기능이 모두 포함되어 있습니다. 디버거의 기능은 액세스 할 수있는 방식 만 변경하지 않았습니다.
- 디버거는 예외가 처리되지 않으면 항상 중단됩니다.
- 사용자가 처리하지 않은 예외에서 디버거가 중단되는 경우 변경할 설정이 컨텍스트 메뉴 아래로 이동했습니다.
- 메뉴 위치가 디버그-> Windows-> 예외 설정으로 이동했습니다.
그러나 나처럼 코드에 Global Unhandled Exception Handler 가있는 경우 해당 목록의 두 번째 항목이 핵심입니다. 따라서 저에게는 예외가 실제로 처리되지 않을 것이므로 VS2013과 다른 것 같습니다.
처리되지 않은 예외에서 VS가 중단되는 동작을 되돌리려면 중단하려는 모든 예외 유형을 선택한 다음 두 번째로 “계속하기”에 대한 “추가 옵션”(이 열을 표시해야 할 수도 있음 *)을 확인해야했습니다. 사용자 코드에서 처리되지 않은 경우 “했다 NOT 설정합니다. VS2015 논리 는 내 전역 처리되지 않은 예외 처리기 를 “사용자 코드에서 처리” 하는 것으로 간주 하지 않는 것 같으 므로 이러한 문제가 발생합니다. 그래도 잡힌 예외에서 중단되지 않습니다. 이것은 VS2013이 한 것처럼 작동합니다.
답변
여기서 줄 사이를 올바르게 읽고 있다면 기본 디버거 동작이 처리되지 않은 예외에서 중단 되더라도 예외가 효과적으로 ‘사라진다’는 문제입니다.
비동기 메서드가있는 경우 작업 연속의 일부로 스레드 풀 스레드에서 포착되지 않은 예외는 처리되지 않은 예외로 간주되지 않기 때문에이 문제가 발생할 수 있습니다. 오히려 그들은 삼켜지고 Task와 함께 저장됩니다.
예를 들어 다음 코드를 살펴보십시오.
class Program
{
static void Main(string[] args)
{
Test();
Console.ReadLine();
}
private async static Task Test()
{
await Task.Delay(100);
throw new Exception("Exception!");
}
}
기본 디버거 설정 (처리되지 않은 예외에서만 중지)으로이 프로그램을 실행하면 디버거가 중단되지 않습니다. 이는 연속에 할당 된 스레드 풀 스레드가 예외를 삼켜 (Task 인스턴스로 전달) 풀로 다시 해제되기 때문입니다.
이 경우 실제 문제는에서 Task
반환 된 항목 Test()
이 확인되지 않는다는 것입니다. 코드에 유사한 유형의 ‘실행 후 삭제’로직이있는 경우 예외가 throw 될 때 예외가 표시되지 않습니다 (메서드 내에서 ‘처리되지 않은’경우에도). 예외는 대기, 결과 확인 또는 명시 적으로 예외를 확인하여 Task를 관찰 할 때만 나타납니다.
이것은 추측 일 뿐이지 만 이와 같은 것을 관찰하고있을 가능성이 높습니다.
답변
내 경험상 2015의 예외 설정은 변경하면 완전히 엉망이됩니다.
부모 그룹 “CLR”이 될 때까지 처리되지 않은 예외가 발생하지 않아야합니다. 예외가 처리되지 않으면 항상 중단됩니다. 그러나 CLR 그룹이 선택 해제 된 경우 try … catch 내부의 코드는 단순히 중단을 일으키지 않아야합니다. 그것은 사실이 아닙니다.
솔루션 : 새 예외 설정 도구 상자에서 마우스 오른쪽 단추를 클릭하고 “기본값 복원”을 선택하십시오. 타다 아아아 … 다시 정상적으로 작동합니다. 이제 그것을 망치지 마십시오.
답변
지침을 따르십시오.
- 예외 설정 창에서 창을 마우스 오른쪽 버튼으로 클릭 한 다음 열 표시를 선택하여 상황에 맞는 메뉴를 엽니 다. (내 코드 만 해제 한 경우이 명령이 표시되지 않습니다.)
- 추가 작업이라는 두 번째 열이 표시되어야합니다. 이 열은 특정 예외에서 사용자 코드로 처리되지 않은 경우 계속을 표시합니다. 즉, 해당 예외가 사용자 코드에서 처리되지 않고 외부 코드에서 처리되는 경우 디버거가 중단되지 않습니다.
- 특정 예외 (예외를 선택하고 마우스 오른쪽 단추를 클릭 한 다음 사용자 코드에서 처리되지 않은 경우 계속 선택 / 선택 취소) 또는 전체 예외 범주 (예 : 모든 공용 언어 런타임 예외)에 대해이 설정을 변경할 수 있습니다.