about_Try_Catch_Finally

업데이트 날짜: 2014년 5월

적용 대상: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

항목

about_Try_Catch_Finally

간단한 설명

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

자세한 설명

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

종료 오류는 문의 실행을 중지합니다. Windows PowerShell®에서 어떤 방식으로든 종료 오류를 처리하지 않으면 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 블록, 0개 이상의 Catch 블록 및 0개 이상의 Finally 블록이 포함됩니다. 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"과 같이 표시할 문을 포함하는 경우 Ctrl+C를 누르면 Finally 블록이 실행된 경우에도 표시되지 않습니다.

오류 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 블록이 있고 두 개의 Catch 블록이 포함되어 있습니다.

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

첫 번째 Catch 블록에서는 System.Net.WebException 및 System.IO.IOException 유형의 오류를 처리합니다. 두 번째 Catch 블록에서는 오류 유형을 지정하지 않습니다. 두 번째 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_Break

about_Continue

about_Scopes

about_Throw

about_Trap