다음을 통해 공유


about_Try_Catch_Finally

간단한 설명

및 블록을 사용하여 trycatchfinally 종료 오류를 처리하는 방법을 설명합니다.

자세한 설명

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

종료 오류로 문 실행이 중지됩니다. PowerShell이 어떤 식으로든 종료 오류를 처리하지 않는 경우 PowerShell은 현재 파이프라인을 사용하여 함수 또는 스크립트 실행을 중지합니다. C#과 같은 다른 언어에서는 종료 오류를 예외라고 합니다.

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

블록에는 catch 오류를 추적하거나 스크립트의 예상 흐름을 복구하기 위한 명령이 포함될 수 있습니다. 블록은 catch catch할 오류 유형을 지정할 수 있습니다. 문에는 try 다양한 종류의 오류에 대한 여러 catch 블록이 포함될 수 있습니다.

finally 블록을 사용하여 스크립트에 더 이상 필요하지 않은 리소스를 해제할 수 있습니다.

try, catchfinally C# 프로그래밍 언어에 사용되는 , catch및 키워드와 finally 유사try합니다.

구문

try 문에는 try 블록, 0개 이상의 catch 블록, 0개 또는 1개의 finally 블록이 포함됩니다. 문에는 try 하나 catch 이상의 블록 또는 하나의 finally 블록이 있어야 합니다.

다음은 블록 구문을 보여줍니다 try .

try {<statement list>}

try 키워드 뒤에는 중괄호로 된 문 목록이 잇습니다. 문 목록의 문이 실행되는 동안 종료 오류가 발생하면 스크립트는 블록의 try 오류 개체를 적절한 catch 블록으로 전달합니다.

다음은 블록 구문을 보여줍니다 catch .

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

오류 유형이 대괄호 안에 표시됩니다. 가장 바깥쪽 대괄호는 요소가 선택 사항임을 나타냅니다.

catch 키워드 뒤에 오류 유형 사양의 선택적 목록과 문 목록이 잇습니다. 블록에서 try 종료 오류가 발생하면 PowerShell에서 적절한 catch 블록을 검색합니다. 블록이 있으면 블록의 catch 문이 실행됩니다.

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

블록이 catch 오류 유형을 지정하는 경우 해당 catch 블록은 해당 유형의 오류를 처리합니다. 블록에서 catch 오류 유형을 지정하지 않으면 해당 catch 블록은 블록에서 try 발생한 오류를 처리합니다. 문에는 try 지정된 여러 오류 유형에 대한 여러 catch 블록이 포함될 수 있습니다.

다음은 블록 구문을 보여줍니다 finally .

finally {<statement list>}

finally 명령문이 오류 없이 실행되었거나 문에 catch 오류가 발생하더라도 try 스크립트가 실행될 때마다 실행되는 문 목록이 키워드 뒤에 붙습니다.

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

오류 catch

다음 샘플 스크립트는 블록이 있는 try 블록을 catch 보여줍니다.

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

키워드는 catch 블록 또는 다른 catch 블록을 바로 따라 try 야 합니다.

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

An error occurred.

스크립트가 "NonsenseString"을 발견하면 종료 오류가 발생합니다. 블록은 catch 블록 내에서 문 목록을 실행하여 오류를 처리합니다.

여러 catch 문 사용

문에는 try 여러 블록이 catch 있을 수 있습니다. 예를 들어 다음 스크립트에는 다운로드MyDoc.doc하는 try 블록이 있으며 두 catch 개의 블록이 포함됩니다.

try {
   $wc = new-object System.Net.WebClient
   $wc.DownloadFile("http://www.contoso.com/MyDoc.doc","c:\temp\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.WebExceptionSystem.IO.IOException 형식의 오류를 처리합니다. 두 번째 catch 블록은 오류 유형을 지정하지 않습니다. 두 번째 catch 블록은 발생하는 다른 종료 오류를 처리합니다.

PowerShell은 상속에 따라 오류 형식과 일치합니다. 블록은 catch 지정된 .NET Framework 예외 클래스 또는 지정된 클래스에서 파생되는 클래스의 오류를 처리합니다. 다음 예제에서는 "명령을 찾을 수 없음" 오류를 catch하는 블록을 포함합니다 catch .

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

지정한 오류 유형인 CommandNotFoundException은 System.SystemException 형식에서 상속됩니다. 다음 예제에서는 찾을 수 없는 명령 오류도 catch합니다.

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

catch 블록은 SystemException 형식에서 상속되는 "명령을 찾을 수 없음" 오류 및 기타 오류를 처리합니다.

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

참고 항목

PowerShell은 모든 예외를 RuntimeException 형식으로 래핑합니다. 따라서 System.Management.Automation.RuntimeException 오류 유형을 지정하는 것은 정규화되지 않은 catch 블록과 동일하게 동작합니다.

Try Catch에서 트랩 사용

블록 내에 try 정의된 블록에서 try 종료 오류가 발생하면 일치하는 catch 블록 Trap Trap 이 있더라도 문이 제어됩니다.

Trap 현재 범위 내에 일치하는 블록이 없는 경우 try부모 범위에 Trap 일치하는 catch 블록이 있더라도 제어할 catch 수 있습니다.

예외 정보 액세스

catch 블록 내에서 현재 오류는 (라고도 $PSItem함)를 사용하여 $_액세스할 수 있습니다. 개체가 ErrorRecord 형식입니다.

try { NonsenseString }
catch {
  Write-Host "An error occurred:"
  Write-Host $_
}

이 스크립트를 실행하면 다음 결과가 반환됩니다.

An Error occurred:
The term 'NonsenseString' is not recognized as the name of a cmdlet, function,
script file, or operable program. Check the spelling of the name, or if a path
was included, verify that the path is correct and try again.

ScriptStackTrace, Exception 및 ErrorDetails와 같이 액세스할 수 있는 추가 속성이 있습니다. 예를 들어 스크립트를 다음으로 변경하는 경우

try { NonsenseString }
catch {
  Write-Host "An error occurred:"
  Write-Host $_.ScriptStackTrace
}

결과는 다음과 유사합니다.

An Error occurred:
at <ScriptBlock>, <No file>: line 2

마지막으로 사용하여 리소스 해제

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

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

참고 항목