예외는 프로그램이 실행되는 동안 발생하는 오류 상태를 나타내는 것입니다. 디버거에 중단될 예외나 예외 집합을 설정하고, 디버거가 중단될 지점을 지정할 수 있습니다 (즉, 디버거에서 일시 중지). 디버거가 중단되면 예외가 throw된 위치를 보여 줍니다. 예외를 추가하거나 삭제할 수도 있습니다. Visual Studio에서 솔루션을 연 상태에서 Windows > 예외 설정 디버그 > 를 사용하여 예외 설정 창을 엽니다.
가장 중요한 예외에 응답하는 처리기를 제공합니다. 예외에 대한 처리기를 추가하는 방법을 알아야 하는 경우 더 나은 C# 코드를 작성하여 버그 수정을 참조하세요. 또한 일부 예외에 대해 항상 실행을 중단하도록 디버거를 구성하는 방법을 알아봅니다.
예외가 발생하면 디버거는 출력 창에 예외 메시지를 씁니다. 다음과 같은 경우 실행을 중단할 수 있습니다.
- 처리되지 않는 예외가 발생합니다.
- 디버거는 처리기가 호출되기 전에 실행을 중단하도록 구성됩니다.
- 내 코드만 설정했으므로 사용자 코드에서 처리되지 않는 예외를 중단하도록 디버거가 구성됩니다.
비고
ASP.NET 브라우저에서 오류 페이지를 표시하는 최상위 예외 처리기가 있습니다. 내 코드만 켜지지 않으면 실행이 중단되지 않습니다. 예를 들어, 아래 사용자 처리되지 않은 예외에 대해 디버거에 계속 진행하도록 지시하는 방법을 참조하십시오.
비고
Visual Basic 애플리케이션에서 디버거는 "On Error" 스타일의 오류 처리기를 사용하는 경우에도 모든 에러를 예외로 관리합니다.
예외가 throw될 때 중단하도록 디버거에 지시
디버거는 예외가 throw되는 지점에서 실행을 중단할 수 있으므로 처리기가 호출되기 전에 예외를 검사할 수 있습니다.
예외 설정 창(Windows > 예외 설정 디버그>)에서 공용 언어 런타임 예외와 같은 예외 범주에 대한 노드를 확장합니다. 그런 다음 System.AccessViolationException과 같은 해당 범주 내의 특정 예외에 대한 확인란을 선택합니다. 예외의 전체 범주를 선택할 수도 있습니다.
팁 (조언)
예외 설정 도구 모음에서 검색 창을 사용하여 특정 예외를 찾거나 검색을 사용하여 특정 네임스페이스(예: System.IO)를 필터링할 수 있습니다.
예외 설정 창에서 예외를 선택하면 처리 여부에 관계없이 예외가 throw될 때마다 디버거 실행이 중단됩니다. 이제 예외를 첫 번째 예외라고 합니다. 예를 들어 다음과 같은 몇 가지 시나리오가 있습니다.
다음 C# 콘솔 애플리케이션에서 Main 메서드는
try/catch블록 내에서 AccessViolationException을 throw 합니다.static void Main(string[] args) { try { throw new AccessViolationException(); Console.WriteLine("here"); } catch (Exception e) { Console.WriteLine("caught exception"); } Console.WriteLine("goodbye"); }Exception Settings에서 AccessViolationException을 선택한 경우, 디버거에서 이 코드를 실행할 때
throw줄에서 실행이 중단됩니다. 그런 다음 실행을 계속할 수 있습니다. 콘솔에 두 줄이 모두 표시되어야 합니다.caught exception goodbye하지만
here줄이 표시되지 않습니다.C# 콘솔 애플리케이션은 두 가지 메서드가 있는 클래스를 사용하여 클래스 라이브러리를 참조합니다. 한 메서드는 예외를 throw하고 처리하지만 두 번째 메서드는 동일한 예외를 throw하지만 처리하지는 않습니다.
public class Class1 { public void ThrowHandledException() { try { throw new AccessViolationException(); } catch (AccessViolationException ave) { Console.WriteLine("caught exception" + ave.Message); } } public void ThrowUnhandledException() { throw new AccessViolationException(); } }콘솔 애플리케이션의 Main() 메서드는 다음과 같습니다.
static void Main(string[] args) { Class1 class1 = new Class1(); class1.ThrowHandledException(); class1.ThrowUnhandledException(); }Exception Settings에서 AccessViolationException을 선택한 경우, 이 코드를 디버거에서 실행하면
throw및 ThrowUnhandledException()의 라인에서 모두 실행이 중단됩니다.
예외 설정을 기본값으로 복원하려면 목록을 기본 설정 단추로 복원 을 선택합니다.
사용자가 처리하지 않은 예외를 계속하도록 디버거에 지시
내 코드만 사용하여 .NET 또는 JavaScript 코드를 디버깅하는 경우 사용자 코드에서 처리되지 않지만 다른 곳에서 처리되는 예외가 중단되지 않도록 디버거에 지시할 수 있습니다.
예외 설정 창에서 열 레이블을 마우스 오른쪽 단추로 클릭하여 바로 가기 메뉴를 연 다음 열 추가 작업 표시를 >선택합니다. ( 내 코드만 끄면 이 명령이 표시되지 않습니다.) 추가 작업 이라는 세 번째 열이 나타납니다.
이 열의 사용자 코드에서 처리되지 않은 경우 Continue 를 보여 주는 예외의 경우 해당 예외가 사용자 코드에서 처리되지 않고 외부에서 처리되는 경우 디버거는 계속됩니다.
특정 예외에 대해 이 설정을 변경하려면 예외를 선택하고 마우스 오른쪽 단추를 클릭하여 바로 가기 메뉴를 표시하고 사용자 코드에서 처리되지 않은 경우 계속을 선택합니다. 전체 공용 언어 런타임 예외와 같은 예외의 전체 범주에 대한 설정을 변경할 수도 있습니다.)
예를 들어 ASP.NET 웹 애플리케이션은 예외를 HTTP 500 상태 코드(ASP.NET Web API의 예외 처리)로 변환하여 예외를 처리합니다. 이는 예외의 원인을 확인하는 데 도움이 되지 않을 수 있습니다. 아래 예제에서 사용자 코드는 String.Format()를 호출하여 FormatException를 throw합니다. 실행은 다음과 같이 중단됩니다.
로 인한 중지
예외 추가 및 삭제
예외를 추가하고 삭제할 수 있습니다. 범주에서 예외 유형을 삭제하려면 예외를 선택하고 예외 설정 도구 모음의 목록 단추(빼기 기호)에서 선택한 예외 삭제를 선택합니다. 또는 예외를 마우스 오른쪽 단추로 클릭하고 바로 가기 메뉴에서 삭제 를 선택할 수 있습니다. 예외를 삭제하면 예외가 선택되지 않은 것과 같은 효과가 있습니다. 즉, 디버거가 예외가 발생했을 때 중단되지 않습니다.
예외를 추가하려면 다음을 수행합니다.
예외 설정 창에서 예외 범주(예: 공용 언어 런타임) 중 하나를 선택합니다.
선택한 범주 단추(더하기 기호) 에 예외 추가 를 선택합니다.
예외의 이름(예: System.UriTemplateMatchException)을 입력합니다.
예외가 목록에 추가되고(사전순으로) 자동으로 확인됩니다.
GPU 메모리 액세스 예외, JavaScript 런타임 예외 또는 Win32 예외 범주에 예외를 추가하려면 오류 코드와 설명을 포함합니다.
팁 (조언)
맞춤법을 확인하세요! 예외 설정 창에서 추가된 예외가 있는지 확인하지 않습니다. 따라서 Sytem.UriTemplateMatchException을 입력하면 해당 예외에 대한 항목이 표시됩니다( System.UriTemplateMatchException이 아님).
예외 설정은 솔루션의 .suo 파일에 유지되므로 특정 솔루션에 적용됩니다. 솔루션 간에 특정 예외 설정을 다시 사용할 수 없습니다. 이제 추가된 예외만 유지됩니다. 삭제된 예외는 그렇지 않습니다. 예외를 추가하고 솔루션을 닫고 다시 열 수 있으며 예외는 계속 존재합니다. 그러나 예외를 삭제하고 솔루션을 닫거나 다시 열면 예외가 다시 나타납니다.
예외 설정 창은 C#에서 일반 예외 형식을 지원하지만 Visual Basic에서는 지원하지 않습니다. 같은 MyNamespace.GenericException<T>예외를 중단하려면 예외를 MyNamespace.GenericException'1로 추가해야 합니다. 즉, 이 코드와 같은 예외를 만든 경우:
public class GenericException<T> : Exception
{
public GenericException() : base("This is a generic exception.")
{
}
}
이전 절차를 사용하여 예외를 예외 설정 에 추가할 수 있습니다.
예외에 조건 추가
예외 설정 창을 사용하여 예외에 대한 조건을 설정합니다. 현재 지원되는 조건에는 예외를 포함하거나 제외할 모듈 이름이 포함됩니다. 모듈 이름을 조건으로 설정하여 특정 코드 모듈에서만 예외를 중단하도록 선택할 수 있습니다. 특정 모듈의 중단을 피하도록 선택할 수도 있습니다.
비고
예외에 조건을 추가하는 것은 Visual Studio 2017부터 지원됩니다.
조건부 예외를 추가하려면:
예외 설정 창에서 [조건 편집 ] 단추를 선택하거나 예외를 마우스 오른쪽 단추로 클릭하고 [조건 편집]을 선택합니다.
예외에 필요한 조건을 더 추가하려면 각 새 조건에 대한 조건 추가 를 선택합니다. 추가 조건선이 나타납니다.
각 조건 줄에 대해 모듈의 이름을 입력하고 비교 연산자 목록을 등호 또는 같지 않음으로 변경합니다. 이름에 와일드카드(\*)를 지정하여 둘 이상의 모듈을 지정할 수 있습니다.
조건을 삭제해야 하는 경우 조건 줄 끝에 있는 X 를 선택합니다.