간단한 설명
종료 오류를 처리하는 키워드에 대해 설명합니다.
긴 설명
종료 오류로 문 실행이 중지됩니다. PowerShell이 어떤 식으로든 종료 오류를 처리하지 않는 경우 PowerShell은 현재 파이프라인에서 함수 또는 스크립트 실행도 중지합니다. C#과 같은 다른 언어에서는 종료 오류를 예외라고 합니다.
Trap 키워드는 종료 오류가 발생할 때 실행할 문 목록을 지정합니다. trap 문은 종료 오류를 처리하고 스크립트 또는 함수의 실행이 중지되는 대신 계속되도록 합니다.
트랩 문은 더 복잡할 수도 있습니다. 트랩의 문 목록에는 여러 조건 또는 함수 호출이 포함될 수 있습니다. 트랩은 로그를 기록하거나 조건을 테스트하거나 다른 프로그램을 실행할 수도 있습니다.
문법
Trap 문에는 다음과 같은 구문이 사용됩니다.
trap [[<error type>]] {<statement list>}
Trap 문에는 종료 오류가 발생할 때 실행할 문 목록이 포함되어 있습니다. Trap 문은 키워드로 trap 구성되며, 선택적으로 형식 식과 오류가 트랩될 때 실행할 문 목록이 포함된 문 블록으로 구성됩니다. type 표현식은 trap이 catch하는 오류 유형을 구체화합니다.
스크립트 또는 명령에는 여러 Trap 문이 있을 수 있습니다. trap 문은 스크립트나 명령의 아무 곳에나 나타날 수 있습니다.
모든 종료 오류 포착하기
스크립트 또는 명령에서 다른 방식으로 처리되지 않는 종료 오류가 발생하면 PowerShell은 오류를 처리하는 Trap 문을 확인합니다. Trap 문이 있는 경우 PowerShell은 Trap 문에서 스크립트 또는 명령을 계속 실행합니다.
다음 예제는 매우 간단한 Trap 문입니다.
trap {"Error found."}
이 Trap 문은 모든 종료 오류를 트래핑합니다.
다음 예제에서 함수는 런타임 오류를 일으키는 넌센스 문자열을 포함합니다.
function TrapTest {
trap {"Error found."}
nonsenseString
}
TrapTest
이 함수를 실행하면 다음이 반환됩니다.
Error found.
다음 예제에는 자동 변수를 사용하여 오류를 표시하는 Trap 문이 포함되어 있습니다 $_ .
function TrapTest {
trap {"Error found: $_"}
nonsenseString
}
TrapTest
이 버전의 함수를 실행하면 다음이 반환됩니다.
Error found: 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 then try
again.
중요합니다
Trap 문은 지정된 범위 내의 아무 곳에나 정의할 수 있지만 항상 해당 범위의 모든 문에 적용됩니다. 런타임에 블록의 트랩은 다른 문이 실행되기 전에 정의됩니다. JavaScript에서는 이를 게양. 이는 트랩이 정의된 지점을 지나 실행이 진행되지 않은 경우에도 해당 블록의 모든 명령문에 적용됨을 의미합니다. 예를 들어, 스크립트의 끝에 트랩을 정의하고 첫 번째 명령문에서 오류를 발생시키면 여전히 해당 트랩이 트리거됩니다.
특정 오류 포착
스크립트 또는 명령에는 여러 Trap 문이 있을 수 있습니다. 특정 오류를 처리하도록 트랩을 정의할 수 있습니다.
다음 예제는 특정 오류 CommandNotFoundException을 트래핑하는 Trap 문입니다.
trap [System.Management.Automation.CommandNotFoundException]
{"Command error trapped"}
함수 또는 스크립트가 알려진 명령과 일치하지 않는 문자열을 발견하면 이 Trap 문은 "명령 오류 트랩됨" 문자열을 표시합니다.
Trap 문 목록을 실행한 후 PowerShell은 오류 개체를 오류 스트림에 쓴 다음 스크립트를 계속합니다.
PowerShell은 Microsoft .NET Framework 예외 유형을 사용합니다. 다음 예제에서는 System.Exception 오류 유형을 지정합니다.
trap [System.Exception] {"An error trapped"}
CommandNotFoundException 오류 유형은 System.Exception 형식에서 상속됩니다. 이 문은 알 수 없는 명령에 의해 생성된 오류를 트랩합니다. 또한 다른 오류 형식을 트래핑합니다.
스크립트에 Trap 문을 두 개 이상 포함할 수 있습니다. 각 오류 유형은 하나의 Trap 문으로만 트래핑할 수 있습니다. 종료 오류가 발생하면 PowerShell은 현재 실행 범위에서 시작하여 가장 구체적인 일치 항목이 있는 트랩을 검색합니다.
다음 스크립트 예제에는 오류가 포함되어 있습니다. 이 스크립트에는 종료 오류를 트래핑하는 일반 Trap 문과 CommandNotFoundException 형식을 지정하는 특정 Trap 문이 포함되어 있습니다.
trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException] {
"Command error trapped"
}
nonsenseString
이 스크립트를 실행하면 다음과 같은 결과가 생성됩니다.
Command error trapped
nonsenseString : 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.
At C:\temp\test\traptest.ps1:5 char:1
+ nonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (nonsenseString:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
PowerShell은 "nonsenseString"을 cmdlet 또는 다른 항목으로 인식하지 않으므로 CommandNotFoundException 오류를 반환합니다. 이 종료 오류는 특정 Trap 문에 의해 트랩됩니다.
다음 스크립트 예제에는 다른 오류가 있는 동일한 Trap 문이 포함되어 있습니다.
trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException]
{"Command error trapped"}
1/$null
이 스크립트를 실행하면 다음과 같은 결과가 생성됩니다.
Other terminating error trapped
Attempted to divide by zero.
At C:\temp\test\traptest.ps1:5 char:1
+ 1/$null
+ ~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
0으로 나누려고 하면 CommandNotFoundException 오류가 발생하지 않습니다. 대신 해당 오류는 종료 오류를 트래핑하는 다른 Trap 문에 의해 트랩됩니다.
트래핑 오류 및 범위
Trap 문과 동일한 범위에서 종료 오류가 발생하는 경우 PowerShell은 trap에 의해 정의된 문 목록을 실행합니다. 실행은 오류가 발생한 후 다음 문에서 계속됩니다. Trap 문이 오류와 다른 범위에 있는 경우 Trap 문과 동일한 범위에 있는 다음 문에서 실행이 계속됩니다.
예를 들어, 함수에서 오류가 발생하고 Trap 문이 함수에 있는 경우 스크립트는 다음 문에서 계속됩니다. 다음 스크립트에는 오류 및 trap 문이 포함되어 있습니다.
function function1 {
trap { "An error: " }
NonsenseString
"function1 was completed"
}
스크립트의 뒷부분에서 Function1 함수를 실행하면 다음과 같은 결과가 생성됩니다.
function1
An error:
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
then try again.
At C:\PS>TestScript1.ps1:3 char:19
+ NonsenseString <<<<
function1 was completed
함수의 Trap 문은 오류를 트래핑합니다. 메시지를 표시한 후 PowerShell은 함수 실행을 다시 시작합니다. 완료 했습니다 Function1 .
이를 동일한 오류 및 Trap 문이 있는 다음 예제와 비교합니다. 이 예제에서 trap 문은 함수 외부에서 발생합니다.
function function2 {
NonsenseString
"function2 was completed"
}
trap { "An error: " }
function2
Function2 함수를 실행하면 다음과 같은 결과가 생성됩니다.
An error:
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
then try again.
At C:\PS>TestScript2.ps1:4 char:19
+ NonsenseString <<<<
이 예제에서는 "function2 was completed" 명령이 실행되지 않았습니다. 두 예제에서 종료 오류는 함수 내에서 발생합니다. 그러나 이 예제에서 Trap 문은 함수 외부에 있습니다. PowerShell은 Trap 문이 실행된 후 함수로 돌아가지 않습니다.
주의
동일한 오류 조건에 대해 여러 트랩이 정의된 경우 어휘적으로 정의된 첫 번째 트랩(범위에서 가장 높음)이 사용됩니다.
다음 예제에서는 "whoops 1"이 있는 트랩만 실행됩니다.
Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { "whoops 1"; continue }
trap { "whoops 2"; continue }
break and continue 키워드 사용
Trap 문에서 and Continue 키워드를 사용하여 Break 종료 오류 후에도 스크립트나 명령이 계속 실행되는지 여부를 확인할 수 있습니다.
Trap 문 목록에 문을 포함 Break 하면 PowerShell은 함수 또는 스크립트를 중지합니다. 다음 샘플 함수는 Trap 문에서 키워드를 사용합니다 Break .
function break_example {
trap {
"Error trapped"
break
}
1/$null
"Function completed."
}
break_example
Error trapped
Attempted to divide by zero.
At line:4 char:7
Trap 문에 키워드가 Break 포함되어 있기 때문에 함수가 계속 실행되지 않고 "Function completed" 줄이 실행되지 않습니다.
Trap 문에 Continue 문을 포함하는 경우 PowerShell은 or Continue가 없는 Break 것처럼 오류를 일으킨 문 다음에 다시 시작됩니다. 그러나 키워드를 Continue 사용하면 PowerShell에서 오류 스트림에 오류를 기록하지 않습니다.
다음 샘플 함수는 Continue 문에서 Trap 키워드를 사용합니다.
function continue_example {
trap {
"Error trapped"
continue
}
1/$null
"Function completed."
}
continue_example
Error trapped
Function completed.
오류가 트랩되고 "Function completed" 문이 실행된 후 함수가 다시 시작됩니다. 오류 스트림에 오류가 기록되지 않습니다.
비고
Trap 문은 범위 내의 모든 종료 오류가 광범위하게 처리되도록 하는 간단한 방법을 제공합니다. 보다 세분화된 오류 처리를 위해 try 문을 사용하여 트랩이 정의된 /catchCatch 블록을 사용합니다.
Catch 문은 연결된 Try 문 내의 코드에만 적용됩니다. 자세한 내용은 about_Try_Catch_Finally를 참조하세요.