연습 - try-catch 예외 처리 구현

완료됨

패턴은 try-catch 블록 뒤에 하나 이상의 catch 절로 구성 try 됩니다. 각 catch 절은 다른 예외 형식에 대한 처리기를 지정합니다.

예외가 throw되면 CLR(공용 언어 런타임)은 예외를 처리할 수 있는 절을 catch 검색합니다. 현재 실행 중인 메서드에 throw된 예외 형식을 catch 처리할 수 있는 절이 없는 경우 CLR은 현재 메서드를 호출한 메서드를 검색합니다. 적절한 catch 절을 찾을 때까지 호출 스택을 통해 검색이 계속됩니다. 예외를 처리할 절이 없 catch 으면 CLR은 처리되지 않은 예외 메시지를 사용자에게 표시하고 프로그램 실행을 중지합니다.

이 연습에서는 기본 try-catch 패턴을 구현합니다.

새 코드 프로젝트 만들기

첫 번째 단계는 이 모듈 중에 사용하는 코드 프로젝트를 만드는 것입니다.

  1. Visual Studio Code의 새 인스턴스를 엽니다.

  2. 파일 메뉴에서 폴더 열기를 선택합니다.

  3. 폴더 열기 대화 상자에서 Windows 데스크톱 폴더로 이동합니다.

  4. 폴더 열기 대화 상자에서 새 폴더를 선택합니다.

  5. 새 폴더의 이름을 Exceptions101로 지정하고 폴더 선택을 선택합니다.

  6. 터미널 메뉴에서 새 터미널을 선택합니다.

    .NET CLI 명령을 사용하여 새 콘솔 앱을 만듭니다.

  7. 터미널 패널 명령 프롬프트에서 다음 명령을 입력합니다.

    dotnet new console
    
  8. 터미널 패널을 닫습니다.

간단한 try-catch 구현

  1. Visual Studio Code EXPLORER 보기를 사용하여 Program.cs 파일을 엽니다.

  2. 보기 메뉴에서 명령 팔레트를 선택합니다.

  3. 명령 프롬프트에서 .net: g 를 입력하고 .NET: 빌드 및 디버그에 대한 자산 생성을 선택합니다.

  4. Program.cs 파일의 내용을 다음 코드로 바꿉다.

    double float1 = 3000.0;
    double float2 = 0.0;
    int number1 = 3000;
    int number2 = 0;
    
    Console.WriteLine(float1 / float2);
    Console.WriteLine(number1 / number2);
    Console.WriteLine("Exit program");
    
  5. 코드를 검사하는 데 몇 분 정도가 걸립니다.

    애플리케이션은 두 개의 숫자 변수 형식 doubleint. 이 코드는 두 숫자 형식을 모두 사용하여 나누기 계산을 수행합니다.

    개발자는 정확한 소수 자릿수 값이 중요한 경우 계산에 형식 변수를 사용합니다 double .

  6. 실행 메뉴에서 디버깅 시작을 선택합니다.

    DivideByZeroException 정수 값을 나눌 때 예외가 발생합니다.

    비고

    형식 double 의 변수를 사용하는 수식이 오류를 일으키지 않고 완료될 수 있음을 알 수 있습니다. 형식 변수를 사용하는 double 0으로 나누기 계산은 무한대, -infinity 또는 "not a number"에 해당하는 결과를 반환합니다. 그렇다고 해서 형식 대신 intdecimal 항상 형식 변수를 사용해야 double 하는 것은 아닙니다. 올바른 방법은 적절한 형식의 변수를 사용하고 예외 처리를 구현하여 발생할 수 있는 오류를 catch하는 것입니다.

  7. 디버그 도구 모음에서 [계속]을 선택합니다.

    디버그 도구 모음의 계속 단추를 보여 주는 스크린샷.

  8. 잠시 시간을 내어 애플리케이션에 대한 메시지 출력을 검사합니다.

    ∞
    Unhandled exception. System.DivideByZeroException: Attempted to divide by zero.
       at Program.<Main>$(String[] args) in C:\Users\msuser\Desktop\Exceptions101\Program.cs:line 7
    

    처리되지 않은 예외로 인해 첫 번째 Console.WriteLine() 문이 완료된 후 애플리케이션이 종료되었습니다.

    비고

    기본적으로 Visual Studio Code는 다른 색 텍스트를 사용하여 디버거에서 생성된 메시지를 표시합니다. 이를 통해 개발자는 애플리케이션 출력과 디버거 메시지를 구분할 수 있습니다. 애플리케이션의 출력을 더 깔끔하게 보려면 다른 콘솔을 사용하도록 launch.json 파일을 구성할 수 있습니다. 예를 들어 애플리케이션 출력에 integratedTerminal 터미널 패널을 사용하도록 설정합니다console. 디버거 메시지는 항상 디버그 콘솔 패널에 표시됩니다.

  9. 다음과 같이 문의 코드 블록 내에 두 개의 계산을 try 묶습니다.

    double float1 = 3000.0;
    double float2 = 0.0;
    int number1 = 3000;
    int number2 = 0;
    
    try
    {
        Console.WriteLine(float1 / float2);
        Console.WriteLine(number1 / number2);
    }
    
    Console.WriteLine("Exit program");
    
  10. 블록의 닫는 대괄호 아래에 빨간색 물결선이 있습니다 try .

    C# 구문에는 catch 문을 사용할 때 or finally 절이 try 필요합니다.

  11. catch 다음과 같이 코드 블록 아래에 try 코드 블록을 생성합니다.

    try
    {
        Console.WriteLine(float1 / float2);
        Console.WriteLine(number1 / number2);
    }
    catch
    {
        Console.WriteLine("An exception has been caught");
    }
    
  12. Visual Studio Code 파일 메뉴에서 저장을 선택합니다.

  13. 실행 메뉴에서 디버깅 시작을 선택합니다.

  14. 잠시 시간을 내어 애플리케이션이 생성한 출력을 검사합니다.

    ∞
    An exception has been caught
    Exit program
    
  15. 예외가 계속 발생하더라도 애플리케이션은 이제 닫기 전에 나머지 코드 줄 실행을 완료할 수 있습니다.

    예외 처리를 사용하면 예외가 발생할 때 코드 실행을 제어할 수 있습니다. 예외 처리는 코드가 안정적이며 예상된 결과를 생성하는 데 도움이 됩니다.

호출된 메서드에서 throw된 예외 catch

대부분의 경우 예외는 throw된 수준 이하의 호출 스택 수준에서 catch됩니다.

예외가 throw되고 현재 메서드가 예외를 catch하지 않으면 공용 언어 런타임이 스택을 해제하고 예외를 처리할 수 있는 절이 포함된 메서드를 catch 찾습니다. 예외를 처리할 수 있는 첫 번째 catch 절이 실행됩니다. 호출 스택에서 적절한 catch 절을 찾을 수 없는 경우 공용 언어 런타임은 프로세스를 종료하고 사용자에게 오류 메시지를 표시합니다.

  1. Program.cs 파일의 코드를 다음 코드로 바꿉다.

    try
    {
        Process1();
    }
    catch
    {
        Console.WriteLine("An exception has occurred");
    }
    
    Console.WriteLine("Exit program");
    
    static void Process1()
    {
        WriteMessage();
    }
    
    static void WriteMessage()
    {
        double float1 = 3000.0;
        double float2 = 0.0;
        int number1 = 3000;
        int number2 = 0;
    
        Console.WriteLine(float1 / float2);
        Console.WriteLine(number1 / number2);
    }
    
  2. 업데이트된 코드를 검토하려면 잠시 시간을 내세요.

    • 최상위 문에는 메서드를 try 호출하는 코드 블록이 Process1() 포함됩니다.
    • 메서드가 Process1() 메서드를 호출합니다 WriteMessage() .
    • 메서드에는 WriteMessage() 예외가 throw되는 코드가 DivideByZeroException 포함됩니다.

    예외는 코드 블록 위의 두 호출 스택 수준인 catch 메서드에서 try 생성됩니다.

    예외가 throw된 위치와 예외가 catch된 위치 사이의 호출 스택 수준을 보여 주는 스크린샷

    최상위 문은 호출 스택에 명명 Main 된 메서드로 표시됩니다.

  3. Visual Studio Code 파일 메뉴에서 저장을 선택합니다.

  4. 실행 메뉴에서 디버깅 시작을 선택합니다.

  5. 잠시 시간을 내어 애플리케이션이 생성한 출력을 검사합니다.

    ∞
    An exception has occurred
    Exit program
    
  6. 예외가 호출 스택에서 두 수준 위로 throw되더라도 여전히 성공적으로 처리됩니다.

요약

이 단원에서 기억해야 하는 몇 가지 중요한 사항은 다음과 같습니다.

  • try-catch 애플리케이션 내에서 지정된 코드 줄에 패턴을 try 구현하고 catch 코드 블록 범위 내에서 발생하는 예외를 try 구현합니다.
  • 절을 catch 사용하여 호출 스택의 동일한 수준에서 throw된 예외를 catch합니다.
  • 절을 catch 사용하여 더 높은 수준의 호출 스택에서 throw된 예외를 catch합니다.