간단한 설명
및 블록을 사용하여 trycatch문 종료 및 finally 스크립트 종료 오류를 처리하는 방법을 설명합니다.
긴 설명
try, catch및 finally 블록을 사용하여 스크립트에서 종료 오류에 응답하거나 처리합니다. PowerShell에는 두 가지 종류의 종료 오류가 있습니다.
- 현재 문을 중지하는 문 종료 오류 및
- 전체 호출 스택을 해제하는 스크립트 종료 오류
두 종류 모두에 의해 try/catchcatch됩니다. 문을 사용하여 trap 종료 오류를 처리할 수도 있습니다. 자세한 내용은 about_Trap참조하세요. 모든 오류 유형에 대한 포괄적인 개요는 about_Error_Handling 참조하세요.
문 종료 오류는 현재 문의 실행을 중지하지만 오류가 스크립트 종료되지 않는 한 PowerShell은 다음 문에서 계속됩니다. 스크립트 종료 오류(예: 키워드에서 throw 생성된 오류)는 블록이나 trap 문에 의해 catch되지 않는 한 전체 스크립트를 try/catch 중지합니다.
메모
$ErrorActionPreference 를 표시하지 않을 throw수 있습니다. 설정하거나 Ignore설정 SilentlyContinue 하면 오류가 전파되지 않으며 다음 문에서 실행이 계속됩니다. 자세한 내용은 about_Error_Handling스크립트 종료 오류 섹션을 참조하세요.
try 블록을 사용하여 PowerShell에서 오류를 모니터링할 스크립트의 섹션을 정의합니다.
try 블록 내에서 오류가 발생하면 오류가 먼저 $Error 자동 변수에 저장됩니다. 그런 다음 PowerShell은 catch 블록을 검색하여 오류를 처리합니다.
try 문에 일치하는 catch 블록이 없으면 PowerShell은 부모 범위에서 적절한 catch 블록 또는 trap 문을 계속 검색합니다.
catch 블록이 완료되거나 적절한 catch 블록이나 trap 문이 없으면 finally 블록이 실행됩니다. 오류를 처리할 수 없는 경우 오류 스트림에 오류가 기록됩니다.
catch 블록에는 오류를 추적하거나 스크립트의 예상 흐름을 복구하기 위한 명령이 포함될 수 있습니다.
catch 블록은 catch할 오류 유형을 지정할 수 있습니다.
try 문에는 다양한 종류의 오류에 대한 여러 catch 블록이 포함될 수 있습니다.
finally 블록을 사용하여 스크립트에서 더 이상 필요하지 않은 리소스를 해제할 수 있습니다.
try, catch및 finally C# 프로그래밍 언어에 사용되는 try, catch및 finally 키워드와 유사합니다.
Syntax
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 키워드 뒤에는 try 문이 오류 없이 실행되었거나 catch 문에 오류가 발생하더라도 스크립트가 실행될 때마다 실행되는 문 목록이 표시됩니다.
Ctrl+C를 누르면 파이프라인이 중지됩니다. 파이프라인으로 전송되는 개체는 출력으로 표시되지 않습니다. 따라서 "Finally block has run"과 같이 표시할 문을 포함하는 경우 블록이 실행되더라도 +finally누른 후에는 표시되지 않습니다.
오류 포착하기
다음 샘플 스크립트는 try 블록이 있는 catch 블록을 보여줍니다.
try { NonsenseString }
catch { "An error occurred." }
catch 키워드는 try 블록 또는 다른 catch 블록 바로 뒤에 있어야 합니다.
PowerShell은 "NonsenseString"을 cmdlet 또는 다른 항목으로 인식하지 않습니다. 이 스크립트를 실행하면 다음 결과가 반환됩니다.
An error occurred.
스크립트가 "NonsenseString"을 발견하면 종료 오류가 발생합니다.
catch 블록은 블록 내에서 문 목록을 실행하여 오류를 처리합니다.
여러 CATCH 문 사용
try 문에는 여러 개의 catch 블록이 있을 수 있습니다. 예를 들어 다음 스크립트에는 try다운로드하는 MyDoc.doc 블록이 있으며 두 개의 catch 블록이 포함됩니다.
try {
$wc = New-Object System.Net.WebClient
$wc.DownloadFile("https://httpbin.org/MyDoc.doc","C:\temp\MyDoc.doc")
} catch [System.Net.WebException],[System.IO.IOException] {
"Unable to download MyDoc.doc from https://httpbin.org."
} catch {
"An error occurred that could not be resolved."
}
첫 번째 catch 블록은 System.Net.WebException 및 System.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 블록 내에 정의된 trap 있는 try 블록에서 종료 오류가 발생하면 일치하는 catch 블록이 있더라도 trap 문이 제어됩니다.
trap
try보다 높은 블록에 있고 현재 범위 내에 일치하는 catch 블록이 없으면 부모 범위에 일치하는 trap 블록이 있더라도 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, 예외및 ErrorDetails같은 추가 속성에 액세스할 수 있습니다. 예를 들어 스크립트를 다음으로 변경하는 경우
try { NonsenseString }
catch {
Write-Host "An error occurred:"
Write-Host $_.ScriptStackTrace
}
결과는 다음과 유사합니다.
An Error occurred:
at <ScriptBlock>, <No file>: line 2
마지막으로 사용하여 리소스 해제
스크립트에서 사용하는 리소스를 해제하려면 finally 및 try 블록 뒤의 catch 블록을 추가합니다.
finally 블록 문은 try 블록에 종료 오류가 발생하는지 여부에 관계없이 실행됩니다. PowerShell은 스크립트가 종료되기 전이나 현재 블록이 범위를 벗어나기 전에 finally 블록을 실행합니다.
finally 블록은 Ctrl+C 사용하여 스크립트를 중지하는 경우에도 실행됩니다.
finally 키워드가 exit 블록 내에서 스크립트를 중지하는 경우에도 catch 블록이 실행됩니다.
다음 예제에서 try 블록은 C:\temp 폴더에 파일을 다운로드하려고 시도합니다.
catch 블록은 다운로드 중에 발생하는 오류를 처리합니다.
finally 블록은 WebClient 개체를 삭제하고 있는 경우 임시 파일을 제거합니다.
try {
$wc = New-Object System.Net.WebClient
$tempFile = "C:\temp\MyDoc.doc"
$wc.DownloadFile("https://httpbin.org/MyDoc.doc",$tempFile)
} catch [System.Net.WebException],[System.IO.IOException] {
"Unable to download MyDoc.doc from https://httpbin.org."
} catch {
"An error occurred that could not be resolved."
} finally {
$wc.Dispose()
if (Test-Path $tempFile) { Remove-Item $tempFile }
}
참고하십시오
PowerShell