다음을 통해 공유


트랩 정보

간단한 설명

종료 오류를 처리하는 키워드(keyword) 설명합니다.

자세한 설명입니다.

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

Trap 키워드(keyword) 종료 오류가 발생할 때 실행할 문 목록을 지정합니다. 트랩 문은 종료 오류를 처리하고 중지하는 대신 스크립트 또는 함수의 실행을 계속할 수 있도록 합니다.

트랩 문은 더 복잡할 수도 있습니다. 트랩의 문 목록에는 여러 조건 또는 함수 호출이 포함될 수 있습니다. 트랩은 로그를 작성하거나, 조건을 테스트하거나, 다른 프로그램을 실행할 수도 있습니다.

Syntax

Trap 문에는 다음 구문이 있습니다.

trap [[<error type>]] {<statement list>}

Trap 문에는 종료 오류가 발생할 때 실행할 문 목록이 포함되어 있습니다. Trap 문은 trap 필요에 따라 키워드(keyword) 형식 식과 오류가 트래핑될 때 실행할 문 목록이 포함된 문 블록으로 구성됩니다. 형식 식은 트랩이 catch하는 오류 유형을 구체화합니다.

스크립트 또는 명령에는 여러 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.

중요

트랩 문은 지정된 scope 내의 모든 위치에 정의될 수 있지만 항상 해당 scope 모든 문에 적용됩니다. 런타임 시 블록의 트랩은 다른 문을 실행하기 전에 정의됩니다. JavaScript에서는 이를 게양이라고 합니다. 즉, 실행이 정의된 지점을 지나서 진행되지 않은 경우에도 해당 블록의 모든 문에 트랩이 적용됩니다. 예를 들어 스크립트 끝에 트랩을 정의하고 첫 번째 문에서 오류를 throw하면 해당 트랩이 계속 트리거됩니다.

특정 오류 트래핑

스크립트 또는 명령에는 여러 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은 현재 실행 scope 시작하여 가장 구체적인 일치 항목이 있는 트랩을 검색합니다.

다음 스크립트 예제에는 오류가 포함되어 있습니다. 스크립트에는 종료 오류를 트래핑하는 일반 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 문에 의해 트래핑됩니다.

트래핑 오류 및 scope

트랩 문과 동일한 scope 종료 오류가 발생하면 PowerShell은 트랩에 정의된 문 목록을 실행합니다. 실행은 오류 이후 문에서 계속됩니다. Trap 문이 오류와 다른 scope 있는 경우 Trap 문과 동일한 scope 다음 문에서 실행이 계속됩니다.

예를 들어 함수에서 오류가 발생하고 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 비교합니다. 이 예제에서 트랩 문은 함수 외부에서 발생합니다.

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가 완료되었습니다." 명령이 실행되지 않았습니다. 두 예제에서 종료 오류는 함수 내에서 발생합니다. 그러나 이 예제에서는 Trap 문이 함수 외부에 있습니다. PowerShell은 Trap 문이 실행된 후 함수로 돌아가지 않습니다.

주의

동일한 오류 조건에 대해 여러 트랩이 정의되면 어휘적으로 정의된 첫 번째 트랩(scope에서 가장 높음)이 사용됩니다.

다음 예제에서는 "whoops 1"이 있는 트랩만 실행됩니다.

Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { "whoops 1"; continue }
trap { "whoops 2"; continue }

breakcontinue 키워드 사용

Trap 문에서 및 Continue 키워드를 사용하여 Break 종료 오류 후 스크립트 또는 명령이 계속 실행되는지 여부를 확인할 수 있습니다.

트랩 문 목록에 문을 포함하는 Break 경우 PowerShell은 함수 또는 스크립트를 중지합니다. 다음 샘플 함수는 Trap 문의 키워드(keyword) 사용합니다 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 문에는 키워드(keyword) 포함되어 Break 있으므로 함수가 계속 실행되지 않고 "함수 완료됨" 줄이 실행되지 않습니다.

Trap 문에 문을 포함 Continue 하면 또는 Continue이 없는 Break 것처럼 오류를 발생시킨 문 다음에 PowerShell이 다시 시작됩니다. Continue 그러나 키워드(keyword) PowerShell은 오류 스트림에 오류를 기록하지 않습니다.

다음 샘플 함수는 문에서 ContinueTrap 키워드(keyword) 사용합니다.

function continue_example {
    trap {
        "Error trapped"
        continue
    }
    1/$null
    "Function completed."
}

continue_example
Error trapped
Function completed.

오류가 트래핑되고 "함수 완료" 문이 실행된 후 함수가 다시 시작됩니다. 오류 스트림에 오류가 기록되지 않습니다.

참고

트랩 문은 scope 내의 모든 종료 오류를 광범위하게 처리하는 간단한 방법을 제공합니다. 보다 세분화된 오류 처리의 경우 문을 사용하여 트랩이 정의된 블록을 사용합니다trycatch/.Catch 문은 Catch 연결된 문 내의 코드에만 적용됩니다 Try . 자세한 내용은 about_Try_Catch_Finally 참조하세요.

추가 정보

about_Break

about_Continue

about_Scopes

about_Throw

about_Try_Catch_Finally