항목
    about_Try_Catch_Finally

간단한 설명
    Try, Catch 및 Finally 블록을 사용하여 종료 오류를 처리하는 방법에 대해 설명합니다.


자세한 설명
    스크립트에서 Try, Catch 및 Finally 블록을 사용하여 종료 오류에 대응하거나 종료 오류를 처리할 수 
    있습니다. Trap 문을 사용하여 스크립트에서 종료 오류를 처리할 수도 있습니다. 자세한 내용은 
    about_Trap을 참조하십시오.


    종료 오류는 문의 실행을 중지합니다. Windows PowerShell에서는 종료 오류를 처리하지 않는 경우 현재 
    파이프라인을 사용하는 함수나 스크립트의 실행도 중지합니다. C# 등의 다른 언어에서는 종료 오류를 
    예외라고 합니다. 오류에 대한 자세한 내용은 about_Errors를 참조하십시오.


    Try 블록을 사용하여 Windows PowerShell에서 오류를 모니터링하도록 할 스크립트의 섹션을 정의할 수 
    있습니다. 오류가 Try 블록 내에서 발생하면 먼저 $Error 자동 변수에 저장됩니다. 이 경우 Windows 
    PowerShell은 오류를 처리할 Catch 블록을 검색합니다. Try 문에 일치하는 Catch 블록이 없으면 Windows 
    PowerShell은 상위 범위에서 적절한 Catch 블록이나Trap 문을 계속 검색합니다. Catch 블록이 완료되거나 
    적절한 Catch 블록이나 Trap 문이 없으면 Finally 블록이 실행됩니다. 오류를 처리할 수 없으면 오류가 
    오류 스트림에 기록됩니다.


    Catch 블록은 실패를 추적하거나 예상되는 스크립트 흐름을 복구하기 위한 명령을 포함할 수 있습니다. 
    Catch 블록은 catch하는 오류 유형을 지정할 수 있습니다. Try 문은 서로 다른 유형의 오류에 대한 
    여러 Catch 블록을 포함할 수 있습니다.


    Finally 블록은 스크립트에서 더 이상 필요하지 않은 리소스를 모두 해제하는 데 사용할 수 있습니다. 


    Try, Catch 및 Finally는 C# 프로그래밍 언어에서 사용되는 Try, Catch 및 Finally 키워드와 유사합니다.


  구문
      Try 문은 Try 블록 한 개와 Catch 블록 0개 이상, Finally 블록 0개 또는 한 개를 포함합니다. 
      Try 문에는 Catch 블록이 하나 이상 있거나 Finally 블록이 하나 있어야 합니다.


      Try 블록의 구문은 다음과 같습니다.

          try {<statement list>}


      Try 키워드 뒤에는 중괄호로 묶인 문 목록이 나옵니다. 문 목록에 있는 문이 실행되는 동안 종료 오류가 
      발생하면 스크립트에서는 Try 블록에서 적절한 Catch 블록으로 오류 개체를 전달합니다. 


      Catch 블록의 구문은 다음과 같습니다. 

          catch [[<error type>][',' <error type>]*] {<statement list>}


      오류 유형은 대괄호 안에 나타납니다. 가장 바깥쪽 대괄호는 해당 요소가 선택 사항임을 나타냅니다.


      Catch 키워드 뒤에는 오류 유형 지정의 선택적 목록과 문 목록이 나옵니다. Try 블록에서 종료 오류가 
      발생하는 경우 Windows PowerShell은 적절한 Catch 블록을 검색합니다. 적절한 Catch 블록을 찾으면 
      Catch 블록에 있는 문이 실행됩니다.


      Catch 블록은 하나 이상의 오류 유형을 지정할 수 있습니다. 오류 유형은 Microsoft .NET Framework 
      예외이거나 .NET Framework 예외에서 파생된 예외입니다. Catch 블록은 지정된 .NET Framework 예외 
      클래스의 오류나 지정된 클래스에서 파생되는 모든 클래스의 오류를 처리합니다.


      Catch 블록에서 오류 유형을 지정하는 경우 해당 Catch 블록은 해당 유형의 오류를 처리합니다. Catch 
      블록에서 오류 유형을 지정하지 않는 경우 해당 Catch 블록은 Try 블록에서 발생하는 모든 오류를 
      처리합니다. Try 문은 서로 다른 지정된 오류 유형에 대한 여러 Catch 블록을 포함할 수 있습니다. 


      Finally 블록의 구문은 다음과 같습니다.

          finally {<statement list>}


      Finally 키워드 뒤에는 Try 문이 오류 없이 실행되었거나 오류가 Catch 문에서 catch된 경우에도 
      스크립트가 실행될 때마다 실행되는 문 목록이 나옵니다. 


      Ctrl+C를 누르면 파이프라인이 중지됩니다. 파이프라인으로 전송되는 개체는 출력으로 표시되지 
      않습니다. 따라서 "Finally block has run"과 같은 표시될 문장을 포함하는 경우 이 문장은 Finally 
      블록이 실행된 경우에도 Ctrl+C를 누른 후 표시되지 않습니다.


  오류 catch
      다음 샘플 스크립트에서는 Catch 블록이 포함된 Try 블록을 보여 줍니다.

          try { NonsenseString }
          catch { "An error occurred." }


      Catch 키워드는 Try 블록이나 다른 Catch 블록 바로 뒤에 나와야 합니다. 


      Windows PowerShell은 "NonsenseString"을 cmdlet 또는 기타 항목으로 인식하지 않으므로 이 
      스크립트를 실행하면 다음과 같은 결과가 반환됩니다.

          An error occurred.


      스크립트에서 "NonsenseString"을 발견하면 종료 오류를 발생시킵니다. Catch 블록은 블록 안에 
      있는 문 목록을 실행하여 오류를 처리합니다.


  여러 Catch 문 사용
      Try 문에는 Catch 블록이 여러 개 있을 수 있습니다. 예를 들어 다음 스크립트에는 MyFile.doc를 
      다운로드하는 Try 블록이 있으며 Try 블록에는 Catch 블록이 두 개 포함되어 있습니다.

          try
          {
             $wc = new-object System.Net.WebClient
             $wc.DownloadFile("http://www.contoso.com/MyDoc.doc")
          }
          catch [System.Net.WebException],[System.IO.IOException]
          {
              "Unable to download MyDoc.doc from http://www.contoso.com."
          }
          catch
          {
              "An error occurred that could not be resolved."
          }


      첫 번째 Catch 블록은 System.Net.WebException 및 System.IO.IOException 유형의 오류를 처리합니다. 
      두 번째 Catch 블록은 오류 유형을 지정하지 않으며, 발생하는 다른 모든 종료 오류를 처리합니다.


      Windows PowerShell은 상속을 통해 오류 유형을 일치시킵니다. Catch 블록은 지정된 .NET Framework 
      예외 클래스의 오류나 지정된 클래스에서 파생되는 모든 클래스의 오류를 처리합니다. 다음 예제에는 
      "Command Not Found" 오류를 catch하는 Catch 블록이 포함되어 있습니다.

          catch [System.Management.Automation.CommandNotFoundException] 
              {"Inherited Exception" }


      지정된 오류 유형인 CommandNotFoundException은 System.SystemException 
      유형에서 상속합니다. 다음 예제에서는 Command Not Found 오류도 catch합니다.

          catch [System.SystemException] {"Base Exception" }


      이 Catch 블록은 "Command Not Found" 오류와 SystemException 유형에서 상속하는 다른 오류를 
      처리합니다.


      오류 클래스를 지정하고 해당 클래스의 파생 클래스 중 하나를 지정하는 경우 일반 클래스에 대한 Catch 
      블록 앞에 파생 클래스에 대한 Catch 블록을 배치합니다.


  Finally를 사용하여 리소스 해제
      스크립트에서 사용하는 리소스를 해제하려면 Try 및 Catch 블록 뒤에 Finally 블록을 추가합니다. Finally 
      블록 문은 Try 블록에서 종료 오류가 발생하는지 여부와 관계없이 실행됩니다. Windows PowerShell은 
      스크립트가 종료되기 전이나 현재 블록이 범위를 벗어나기 전에 Finally 블록을 실행합니다. 


      Finally 블록은 Ctrl+C를 사용하여 스크립트를 중지하는 경우에도 실행됩니다. Finally 블록은 Exit 
      키워드가 Catch 블록 내에서 스크립트를 중지하는 경우에도 실행됩니다.


참고 항목
    about_Errors
    about_Trap




목차