Visual Studio에서 디버거를 사용한 예외 관리Manage exceptions with the debugger in Visual Studio

예외는 프로그램이 실행되는 동안 발생하는 오류 상태를 나타냅니다.An exception is an indication of an error state that occurs while a program is being executed. 중단할 예외 또는 예외 세트를 디버거에 알리고 디버거를 중단할 지점(즉, 디버거에서 일시 중지)을 지정할 수 있습니다.You can tell the debugger which exceptions or sets of exceptions to break on, and at which point you want the debugger to break (that is, pause in the debugger). 디버거가 중단되면 예외가 throw된 위치가 표시됩니다.When the debugger breaks, it shows you where the exception was thrown. 예외를 추가하거나 삭제할 수도 있습니다.You can also add or delete exceptions. Visual Studio에서 솔루션을 연 상태로 디버그 > Windows > 예외 설정 을 사용하여 예외 설정 창을 엽니다.With a solution open in Visual Studio, use Debug > Windows > Exception Settings to open the Exception Settings window.

가장 중요한 예외에 응답하는 처리기를 제공합니다.Provide handlers that respond to the most important exceptions. 예외에 대한 처리기를 추가하는 방법을 알아야 하는 경우 더 나은 C# 코드를 작성하여 버그 수정을 참조하세요.If you need to know how to add handlers for exceptions, see Fix bugs by writing better C# code. 또한 일부 예외에 대해 항상 실행을 중단하도록 디버거를 구성하는 방법에 대해 알아봅니다.Also, learn how to configure the debugger to always break execution for some exceptions.

예외가 발생하면 디버거가 출력 창에 예외 메시지를 씁니다.When an exception occurs, the debugger writes an exception message to the Output window. 다음과 같은 경우에 실행이 중단될 수 있습니다.It may break execution in the following cases when:

  • 처리되지 않은 예외가 throw됩니다.An exception is thrown that isn't handled.
  • 디버거는 처리기가 호출되기 전에 실행을 중단하도록 구성되어 있습니다.The debugger is configured to break execution before any handler is invoked.
  • 내 코드만을 설정했으며, 사용자 코드에서 처리되지 않은 예외가 중단되도록 디버거가 구성되어 있습니다.You have set Just My Code, and the debugger is configured to break on any exception that isn't handled in user code.

참고

ASP.NET에는 브라우저에 오류 페이지를 표시하는 최상위 예외 처리기가 있습니다.ASP.NET has a top-level exception handler that shows error pages in a browser. 내 코드만 이 설정되지 않은 경우에는 실행이 중단되지 않습니다.It doesn't break execution unless Just My Code is turned on. 예제를 보려면 아래의 사용자가 처리하지 않은 예외를 계속하도록 디버거에 지시를 참조하세요.For an example, see Tell the debugger to continue on user-unhandled exceptions below.

참고

Visual Basic 애플리케이션에서 디버거는 모든 오류를 예외로 관리합니다. 이는 On Error 스타일의 오류 처리기를 사용하는 경우에도 마찬가지입니다.In a Visual Basic application, the debugger manages all errors as exceptions, even if you use On Error-style error handlers.

예외가 throw되면 중단하도록 디버거에게 지시합니다.Tell the debugger to break when an exception is thrown

디버거는 예외가 throw된 지점에서 실행을 중단할 수 있으므로 처리기가 호출되기 전에 예외를 검사할 수 있습니다.The debugger can break execution at the point where an exception is thrown, so you may examine the exception before a handler is invoked.

예외 설정 창(디버그 > Windows > 예외 설정)에서 공용 언어 런타임 예외 와 같은 예외 범주에 대한 노드를 확장합니다.In the Exception Settings window (Debug > Windows > Exception Settings), expand the node for a category of exceptions, such as Common Language Runtime Exceptions. 그런 다음, System.AccessViolationException 과 같은 해당 범주 내의 특정 예외에 대한 확인란을 선택합니다.Then select the check box for a specific exception within that category, such as System.AccessViolationException. 전체 예외 범주를 선택할 수도 있습니다.You can also select an entire category of exceptions.

확인된 AccessViolationExceptionChecked AccessViolationException

예외 설정 도구 모음에 있는 검색 창을 사용하여 특정 예외를 찾거나 검색을 사용하여 특정 네임스페이스(예: System.IO)를 필터링할 수 있습니다.You can find specific exceptions by using the Search window in the Exception Settings toolbar, or use search to filter for specific namespaces (such as System.IO).

예외 설정 창에서 예외를 선택하면 처리 여부에 관계없이 예외가 throw될 때마다 디버거 실행이 중단됩니다.If you select an exception in the Exception Settings window, debugger execution will break wherever the exception is thrown, no matter whether it's handled. 이제 이 예외를 첫 번째 예외라고 합니다.Now the exception is called a first chance exception. 예를 들어 다음은 몇 가지 시나리오입니다.For example, here are a couple of scenarios:

  • 다음 C# 콘솔 애플리케이션에서 Main 메서드는 try/catch 블록 내부에서 AccessViolationException 을 발생시킵니다.In the following C# console application, the Main method throws an AccessViolationException inside a try/catch block.

    static void Main(string[] args)
    {
        try
        {
            throw new AccessViolationException();
            Console.WriteLine("here");
        }
        catch (Exception e)
        {
            Console.WriteLine("caught exception");
        }
        Console.WriteLine("goodbye");
    }
    

    예외 설정 에서 AccessViolationException 을 선택한 경우 이 코드를 디버거에서 실행하면 throw 줄에서 실행이 중단됩니다.If you have AccessViolationException checked in Exception Settings, execution will break on the throw line when you run this code in the debugger. 그런 다음 실행을 계속할 수 있습니다.You can then continue execution. 콘솔에 다음 두 줄이 모두 표시됩니다.The console should display both lines:

    caught exception
    goodbye
    

    그러나 here 줄은 표시되지 않습니다.but it doesn't display the here line.

  • C# 콘솔 애플리케이션은 두 개의 메서드가 있는 클래스를 사용하여 클래스 라이브러리를 참조합니다.A C# console application references a class library with a class that has two methods. 한 메서드는 예외를 throw하고 처리하지만, 두 번째 메서드는 동일한 예외를 throw하지만 처리하지는 않습니다.One method throws an exception and handles it, while a second method throws the same exception but doesn't handle it.

    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() 메서드는 다음과 같습니다.Here's the Main() method of the console application:

    static void Main(string[] args)
    {
        Class1 class1 = new Class1();
        class1.ThrowHandledException();
        class1.ThrowUnhandledException();
    }
    

    예외 설정 에서 AccessViolationException 을 선택한 경우 이 코드를 디버거에서 실행하면 ThrowHandledException()ThrowUnhandledException()throw 줄에서 실행이 중단됩니다.If you have AccessViolationException checked in Exception Settings, execution will break on the throw line in both ThrowHandledException() and ThrowUnhandledException() when you run this code in the debugger.

예외 설정을 기본값으로 복원하려면 기본 설정으로 목록 복원 단추를 선택합니다.To restore the exception settings to the defaults, choose the Restore the list to the default settings button:

예외 설정에서 기본값 복원Restore defaults in Exception Settings

사용자가 처리하지 않은 예외에 대해 계속하도록 디버거에 지시Tell the debugger to continue on user-unhandled exceptions

내 코드만을 사용하여 .NET 또는 JavaScript 코드를 디버깅하는 경우 사용자 코드에서 처리되지 않았지만 다른 위치에서는 처리되는 예외가 중단하지 않도록 디버거에 지시할 수 있습니다.If you are debugging .NET or JavaScript code with Just My Code, you can tell the debugger to prevent breaking on exceptions that aren't handled in user code but are handled elsewhere.

  1. 예외 설정 창에서 열 레이블을 마우스 오른쪽 단추로 클릭하여 바로 가기 메뉴를 연 다음, 열 >추가 작업 표시 를 선택합니다.In the Exception Settings window, open the shortcut menu by right-clicking a column label, and then select Show Columns > Additional Actions. (내 코드만 을 해제한 경우에는 이 명령이 표시되지 않습니다.) 추가 작업 이라는 세 번째 열이 표시됩니다.(If you've turned off Just My Code, you won't see this command.) A third column named Additional Actions appears.

    추가 작업 열Additional Actions column

    이 열에서 사용자 코드에서 처리되지 않은 경우 계속 을 표시하는 예외의 경우 해당 예외가 사용자 코드에서 처리되지 않고 외부에서 치리되면 디버거는 계속됩니다.For an exception that shows Continue when unhandled in user code in this column, the debugger continues if that exception isn't handled in user code but is handled externally.

  2. 특정 예외에 대한 이 설정을 변경하려면 예외를 선택하고, 마우스 오른쪽 단추를 클릭하여 바로 가기 메뉴를 표시하고, 사용자 코드에서 처리되지 않은 경우 계속 을 선택합니다.To change this setting for a particular exception, select the exception, right-click to show the shortcut menu, and select Continue When Unhandled in User Code. 전체 공용 언어 런타임 예외와 같은 전체 예외 범주에 대한 설정을 변경할 수도 있습니다).You may also change the setting for an entire category of exceptions, such as the entire Common Language Runtime exceptions).

    사용자 코드에서 처리되지 않은 경우 계속 설정Continue when unhandled in user code setting

예를 들어 ASP.NET 웹 애플리케이션은 예외를 HTTP 500 상태 코드(ASP.NET Web API의 예외 처리)로 변환하여 예외를 처리하므로 예외의 소스를 확인하는 데 도움이 되지 않을 수도 있습니다.For example, ASP.NET web applications handle exceptions by converting them to an HTTP 500 status code (Exception handling in ASP.NET Web API), which may not help you determine the source of the exception. 아래 예제에서는 사용자 코드가 String.Format() 을 발생시키는 FormatException을 호출합니다.In the example below, the user code makes a call to String.Format() that throws a FormatException. 다음과 같이 실행이 중단됩니다.Execution breaks as follows:

사용자가 처리하지 않은 예외 중단Breaks on user-unhandled exception

예외 추가 및 삭제Add and delete exceptions

예외를 추가하거나 삭제할 수 있습니다.You can add and delete exceptions. 범주에서 예외 유형을 삭제하려면 예외를 선택하고 예외 설정 도구 모음에서 선택한 예외를 목록에서 삭제 단추(빼기 기호)를 선택합니다.To delete an exception type from a category, select the exception, and choose the Delete the selected exception from the list button (the minus sign) on the Exception Settings toolbar. 또는 예외를 마우스 오른쪽 단추로 클릭하고 바로 가기 메뉴에서 삭제 를 선택할 수 있습니다.Or you may right-click the exception and select Delete from the shortcut menu. 예외를 삭제하는 것은 예외를 선택 취소하는 것과 같은 효과를 가집니다. 즉, 해당 예외가 throw될 때 디버거가 중단되지 않습니다.Deleting an exception has the same effect as having the exception unchecked, which is that the debugger won't break when it's thrown.

예외를 추가하려면 다음을 수행합니다.To add an exception:

  1. 예외 설정 창에서 예외 범주 중 하나(예: 공용 언어 런타임)를 선택합니다.In the Exception Settings window, select one of the exception categories (for example, Common Language Runtime).

  2. 선택한 범주에 예외 추가 단추(더하기 기호)를 선택합니다.Choose the Add an exception to the selected category button (the plus sign).

    선택한 범주에 예외 추가 단추Add an exception to the selected category button

  3. 예외 이름을 입력합니다(예: System.UriTemplateMatchException).Type the name of the exception (for example, System.UriTemplateMatchException).

    예외 이름 입력Type the exception name

    예외가 목록에 추가(사전순으로)되고 자동으로 확인됩니다.The exception is added to the list (in alphabetical order) and automatically checked.

GPU 메모리 액세스 예외, JavaScript 런타임 예외 또는 Win32 예외 범주에 예외를 추가하려면 오류 코드 및 설명을 포함합니다.To add an exception to the GPU Memory Access Exceptions, JavaScript Runtime Exceptions, or Win32 Exceptions categories, include the error code and the description.

맞춤법 검사를 수행합니다.Check your spelling! 예외 설정 창에서는 추가된 예외가 있는지 검사하지 않습니다.The Exception Settings window doesn't check for the existence of an added exception. 따라서 Sytem.UriTemplateMatchException 을 입력하면 해당 예외에 대한 항목( System.UriTemplateMatchException 에 대한 항목이 아님)을 얻게 됩니다.So if you type Sytem.UriTemplateMatchException, you'll get an entry for that exception (and not for System.UriTemplateMatchException).

예외 설정은 솔루션의 .suo파일에 유지되므로 특정 솔루션에 적용됩니다.Exception settings are persisted in the solution's .suo file, so they apply to a particular solution. 특정 예외 설정을 여러 솔루션에서 다시 사용할 수 없습니다.You can't reuse specific exception settings across solutions. 이제 추가된 예외만 유지되고, 삭제된 예외는 유지되지 않습니다.Now only added exceptions are persisted; deleted exceptions aren't. 예외를 추가하고 솔루션을 닫았다가 다시 열면 예외가 그대로 유지됩니다.You may add an exception, close and reopen the solution, and the exception will still be there. 그러나 예외를 삭제한 후 솔루션을 닫았다가 다시 열면 예외가 다시 나타나지 않습니다.But if you delete an exception and close/reopen the solution, the exception will reappear.

예외 설정 창은 C#의 일반적인 예외 형식을 지원하지만 Visual Basic의 일반 예외 형식은 지원하지 않습니다.The Exception Settings window supports generic exception types in C# but not in Visual Basic. MyNamespace.GenericException<T>와 같은 예외에서 실행을 중단하려면 MyNamespace.GenericException`1 과 같은 예외를 추가해야 합니다.To break on exceptions like MyNamespace.GenericException<T>, you must add the exception as MyNamespace.GenericException`1. 즉, 다음 코드와 같은 예외를 만든 경우:That is, if you've created an exception like this code:

public class GenericException<T> : Exception
{
    public GenericException() : base("This is a generic exception.")
    {
    }
}

이전 절차를 사용하여 예외 설정 에 다음과 같은 예외를 추가할 수 있습니다.You can add the exception to Exception Settings using the previous procedure:

일반 예외 추가adding generic exception

예외에 조건 추가Add conditions to an exception

예외 설정 창을 사용하여 예외에 대한 조건을 설정합니다.Use the Exception Settings window to set conditions on exceptions. 현재 지원되는 조건에는 예외에 포함하거나 제외할 모듈 이름이 포함됩니다.Currently supported conditions include the module name(s) to include or exclude for the exception. 모듈 이름을 조건으로 설정하여 특정 코드 모듈에서만 예외를 중단하도록 선택할 수 있습니다.By setting module names as conditions, you can choose to break for the exception only on certain code modules. 특정 모듈을 중단하지 않도록 선택할 수도 있습니다.You may also choose to avoid breaking on particular modules.

참고

Visual Studio 2017Visual Studio 2017부터 예외에 조건을 추가할 수 있습니다.Adding conditions to an exception is supported starting in Visual Studio 2017Visual Studio 2017.

조건부 예외를 추가하려면 다음을 수행합니다.To add conditional exceptions:

  1. 예외 설정 창에서 조건 편집 단추를 선택하거나 예외를 마우스 오른쪽 단추로 클릭하고 조건 편집 을 선택합니다.Choose the Edit conditions button in the Exception Settings window, or right-click the exception and choose Edit Conditions.

    예외에 대한 조건Conditions for an exception

  2. 예외에 필요한 조건을 더 추가하려면 각 새 조건마다 조건 추가 를 선택합니다.To add extra required conditions to the exception, select Add Condition for each new condition. 추가 조건 줄이 표시됩니다.Additional condition lines appear.

    예외에 대한 추가 조건Extra conditions for an exception

  3. 각 조건 줄에 대해 모듈의 이름을 입력하고 비교 연산자 목록을 같음 또는 같지 않음 으로 변경합니다.For each condition line, type the name of the module, and change the comparison operator list to Equals or Not Equals. 이름에 와일드카드(* \* _)를 지정하여 둘 이상의 모듈을 지정할 수 있습니다.You may specify wildcards (*\* _) in the name to specify more than one module.

  4. 조건을 삭제해야 하는 경우 조건 줄 끝에 있는 _ *X**를 선택합니다.If you need to delete a condition, choose the _ X* at the end of the condition line.

참조See also