HOWTO · PowerShell

PowerShell에서 Try-Catch 블록을 사용하여 오류를 처리하는 방법

이 문서에서는 PowerShell의 오류 작업 기본 설정과 PowerShell Try Catch 및 Finally 블록을 사용하여 이를 가로채 오류 처리를 수행하는 방법에 대해 설명합니다.

이 페이지의 내용

PowerShell에서 try와 catch는 종료 오류를 처리합니다. 많은 cmdlet이 오류를 종료되지 않는 오류로 보고하므로, 작업의 실패가 catch 블록에 도달해야 할 때는 -ErrorAction Stop을 추가하세요. $ErrorActionPreference는 해당 범위에서 종료되지 않는 오류에 대한 기본 처리를 설정하고, -ErrorAction은 하나의 명령에 대한 동작을 설정합니다.

PowerShell의 $ErrorActionPreference 변수

$ErrorActionPreference는 해당 범위에서 PowerShell이 종료되지 않는 오류에 응답하는 방식을 제어합니다. 기본값은 Continue입니다. PowerShell은 오류를 보고하고 다음 문으로 계속 진행합니다. 이를 Stop으로 설정하면 종료되지 않는 오류가 종료 오류로 승격되어 현재 흐름을 중단하고 주변의 catch에서 처리할 수 있습니다. catch가 오류를 처리한 후에는 실행이 주변 제어 흐름을 따릅니다. 오류가 자동으로 전체 스크립트를 종료하지는 않습니다.

스크립트의 일부에만 이 동작이 필요한 경우 범위가 지정된 변경을 사용하세요. 이전 값을 저장하고, 이후 명령에서 이전 설정을 사용해야 한다면 finally 블록에서 복원하세요. 이 기본 설정은 PowerShell의 오류 작업 기본 설정을 따르는 명령에 적용되며, 모든 종류의 실패에 대한 명시적 처리를 대체하지는 않습니다.

PowerShell의 ErrorAction 일반 매개변수

-ErrorAction은 많은 cmdlet과 함수에서 지원하는 일반 매개변수입니다. 그 값은 해당 명령에 적용되며, 해당 호출에 대해서는 $ErrorActionPreference보다 우선합니다. 예를 들어, Get-Content $path -ErrorAction Stop은 종료되지 않는 읽기 오류를 해당 명령에 대해 종료 오류로 만듭니다. 그러면 주변의 catch가 이를 처리할 수 있습니다. 이 매개변수는 명령의 오류가 처리되는 방식을 변경합니다. 복구 논리는 주변 스크립트에 속합니다.

값에는 Continue와 Stop이 포함되며, 지원되는 경우 SilentlyContinue, Ignore, Inquire, Suspend와 같은 작업도 포함됩니다. 더 넓은 범위를 변경하는 대신, 실패를 포착해야 하는 작업에 -ErrorAction Stop을 선호하세요. 명령은 이 설정과 무관하게 종료 오류를 생성할 수도 있습니다.

PowerShell try-catch 블록 사용

실패할 수 있는 문은 try 안에 배치하세요. 종료 오류는 제어를 일치하는 catch로 이전합니다. 형식이 지정되지 않은 catch는 모든 종료 오류를 처리하고, catch [System.IO.IOException]와 같은 형식 지정 형태는 해당 형식의 오류를 처리합니다. 특정 catch를 일반 catch보다 앞에 배치하세요. $Error는 PowerShell의 자동 오류 기록 컬렉션이지, 현재 실패만을 나타내는 변수가 아닙니다. catch 블록 내부에서 $_($PSItem으로도 사용 가능)는 현재 오류 레코드를 설명합니다. 그 Exception 또는 FullyQualifiedErrorId 속성은 진단에 도움이 될 수 있습니다.

finally 블록은 선택 사항이며, 정상적으로 완료되었든 오류가 처리되었든 try 문에서 제어가 벗어날 때 실행됩니다. 작업 전에 연 리소스를 삭제하는 등의 정리에 사용하세요. catch 블록은 오류를 복구하거나, 기록하거나, 다시 throw할 수 있습니다. 오류를 포착하는 것 자체가 주변 스크립트가 남은 작업을 계속해야 하는지를 결정하지는 않습니다.

다음 실행 가능한 예제는 성공 경로를 따르며 정리 줄 앞에 상태 줄을 출력합니다. 이 코드에는 외부 파일 종속성이 없습니다.

try {
    $reportName = "daily-report.txt"
    Write-Output "Prepared $reportName"
}
finally {
    Write-Output "Finished report step"
}
Prepared daily-report.txt
Finished report step

종료되지 않는 오류를 포착해야 하는 cmdlet의 경우, try 내부의 해당 cmdlet에 -ErrorAction Stop을 추가하세요. 프로덕션 스크립트에서는 경로와 기타 입력을 명시적으로 유지한 다음, 작업에 따라 기록, 재시도, 복구 또는 다시 throw 중 어느 것을 할지 선택하세요. 이 샘플은 성공 경로를 보여 줍니다. 실패를 처리해야 하는 명령 주위에 동일한 제어 흐름 구조를 적용하세요.