다음을 통해 공유


트랩_소개

간단한 설명

종료 오류를 처리하는 키워드에 대해 설명합니다.

긴 설명

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

trap 키워드는 종료 오류가 발생할 때 실행할 문 목록을 지정합니다. trap 문은 다음과 같은 방법으로 종료 오류를 처리할 수 있습니다.

  • trap 문 블록을 처리하고 trap포함하는 스크립트 또는 함수를 계속 실행한 후 오류를 표시합니다. 이 옵션은 기본 동작입니다.

    비고

    if 문 또는 foreach 루프와 같은 하위 스크립트 블록에서 종료 오류가 발생하면 trap 블록의 문이 실행되고 하위 스크립트 블록 외부의 다음 문에서 실행이 계속됩니다.

  • trap 문의 break을 사용하여 trap을 포함하는 스크립트 또는 함수에서 오류를 표시하고 실행을 중단합니다.

  • 오류를 무시하고, trap 문에서 continue을(를) 사용하여 trap을(를) 포함한 스크립트나 함수를 계속 실행합니다.

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

문법

trap 문에는 다음과 같은 구문이 사용됩니다.

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

trap 문에는 종료 오류가 발생할 때 실행할 문 목록이 포함되어 있습니다. trap 문은 trap 키워드로 구성되며, 필요에 따라 형식 식과 오류가 트래핑될 때 실행할 문 목록이 포함된 문 블록으로 구성됩니다. 타입 표현은 trap가 포착하는 오류의 유형을 구체화합니다.

스크립트 또는 명령에는 여러 trap 문이 있을 수 있습니다. trap 명령문은 스크립트 또는 명령의 아무 곳에나 나타날 수 있습니다.

모든 종료 오류 포착하기

스크립트 또는 명령에서 다른 방식으로 처리되지 않는 종료 오류가 발생하면 PowerShell은 오류를 처리하는 문을 확인합니다 trap . trap 문이 있는 경우 PowerShell은 trap 문에서 스크립트 또는 명령을 계속 실행합니다.

다음 예는 매우 간단한 trap 명령문입니다.

trap {"Error found."}

trap 문은 종료 오류를 포착합니다.

다음 예제에서 함수는 런타임 오류를 일으키는 넌센스 문자열을 포함합니다.

function TrapTest {
    trap {"Error found."}
    nonsenseString
}

TrapTest

이 함수를 실행하면 다음이 반환됩니다.

Error found.
nonsenseString:
Line |
   3 |      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.

다음 예제에서는 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 try again.
nonsenseString:
Line |
   3 |      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.

중요합니다

trap 명령문은 지정된 범위 내의 아무 곳에나 정의 될 수 있지만 항상 해당 범위의 모든 명령문에 적용됩니다. 런타임 시 블록의 trap 문은 다른 문이 실행되기 전에 정의됩니다. JavaScript에서는 이를 게양. 이는 명령문이 trap 정의된 지점을 지나 실행이 진행되지 않은 경우에도 해당 블록의 모든 명령문에 적용됨을 의미합니다. 스크립트 끝에 trap을 정의하고 첫 번째 문장에서 오류를 발생시켜도 여전히 해당 trap이 트리거됩니다.

특정 오류 포착

스크립트 또는 명령에는 여러 trap 문이 있을 수 있습니다. 특정 오류를 처리하도록 trap 정의할 수 있습니다.

다음 예제는 특정 오류 CommandNotFoundException trap를 트래핑하는 문입니다.

trap [System.Management.Automation.CommandNotFoundException]
    {"Command error trapped"}

함수 또는 스크립트가 알려진 명령과 일치하지 않는 문자열을 발견하면 이 trap 문은 "명령 오류 트랩됨" 문자열을 표시합니다. trap 문 목록을 실행한 후 PowerShell은 오류 개체를 오류 스트림에 쓴 다음 스크립트를 계속합니다.

PowerShell은 .NET 예외 형식을 사용합니다. 다음 예제에서는 System.Exception 오류 유형을 지정합니다.

trap [System.Exception] {"An error trapped"}

CommandNotFoundException 오류 유형은 System.Exception 형식에서 상속됩니다. 이 문은 알 수 없는 명령에 의해 생성된 오류를 트랩합니다. 또한 다른 오류 형식을 트래핑합니다.

스크립트에는 trap 문을 둘 이상 넣을 수 있습니다. 각 오류 유형은 하나의 trap 문으로만 트래핑할 수 있습니다. 종료 오류가 발생하면 PowerShell은 현재 실행 범위에서 시작하여 가장 구체적인 일치 항목이 있는 를 trap 검색합니다.

다음 스크립트 예제에는 오류가 포함되어 있습니다. 스크립트에는 종료 오류를 트래핑하는 일반 trap 문과 trap 형식을 지정하는 특정 문이 포함되어 있습니다.

trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException] {
  "Command error trapped"
}
nonsenseString

이 스크립트를 실행하면 다음과 같은 결과가 생성됩니다.

Command error trapped
nonsenseString:
Line |
   5 |  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.

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
RuntimeException:
Line |
   4 |  1/$null
     |  ~~~~~~~
     | Attempted to divide by zero.

0으로 나누려고 하면 CommandNotFoundException 오류가 발생하지 않습니다. 대신, 해당 오류는 종료 오류를 트래핑하는 other trap 문에 의해 트랩됩니다.

스크립트 블록의 트래핑 오류

기본적으로 종료 오류가 발생하면 실행이 예외 처리 문으로 전송됩니다. trap 블록이 실행되면 제어가 오류가 발생한 위치의 다음 문장 블록으로 이동합니다.

예를 들어 foreach 문에서 종료 오류가 발생하면 trap 문이 실행되고 foreach 블록이 아닌 foreach 블록 뒤의 다음 문에서 실행이 계속됩니다.

trap { 'An error occurred!'}
foreach ($x in 3..0) {
   1/$x
   'after division'
}
'after loop'
0.333333333333333
after division
0.5
after division
1
after division
An error occurred!
RuntimeException: untitled:Untitled-1:3:4
Line |
   3 |     1/$x
     |     ~~~~
     | Attempted to divide by zero.

after loop

위의 출력에서 마지막 반복까지 루프가 계속되는 것을 볼 수 있습니다. 스크립트가 1을 0으로 나누려고 하면 종료 오류가 발생합니다. scriptblock의 foreach 나머지 부분은 건너뛰고, statement는 try 실행되며, scriptblock은 scriptblock 뒤에 계속됩니다 foreach .

트래핑 오류 및 범위

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

예를 들어 함수에서 오류가 발생하고 trap 문이 함수에 있는 경우 스크립트는 다음 문에서 계속됩니다. 다음 스크립트에는 오류 및 trap 문이 포함되어 있습니다.

function function1 {
    trap { "An error: " }
    NonsenseString
    "function1 was completed"
}

function1

이 스크립트를 실행하면 다음과 같은 결과가 생성됩니다.

An error:
NonsenseString:
Line |
   3 |      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.
function1 was completed

함수의 trap 문은 오류를 포착합니다. 메시지를 표시한 후 PowerShell은 함수 실행을 다시 시작합니다. 완료 했습니다 Function1 .

이를 동일한 오류 및 trap 문이 있는 다음 예제와 비교합니다. 이 예제에서 trap 문은 함수 외부에서 발생합니다.

function function2 {
    NonsenseString
    "function2 was completed"
}

trap { "An error: " }

function2

Function2 함수를 실행하면 다음과 같은 결과가 생성됩니다.

An error:
NonsenseString:
Line |
   2 |      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.

이 예제에서는 "function2 was completed" 명령이 실행되지 않았습니다. 두 예제에서 종료 오류는 함수 내에서 발생합니다. 그러나 이 예제에서는 trap 문이 함수 외부에 있습니다. PowerShell은 문이 실행된 후 trap 함수로 다시 이동하지 않습니다.

주의

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

다음 예제에서는 with "whoops 1"만 trap 실행됩니다.

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

중요합니다

Trap 문은 컴파일되는 위치로 범위가 지정됩니다. 함수 또는 점 소스 스크립트 내에 trap 문이 있는 경우 함수 또는 점 소스 스크립트가 종료되면 내부의 모든 trap 문이 제거됩니다.

break 및 continue 키워드 사용

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

break 문 목록에 trap 문을 포함하는 경우 PowerShell은 함수 또는 스크립트를 중지합니다. 다음 샘플 함수는 break 문에서 trap 키워드를 사용합니다.

function break_example {
    trap {
        "Error trapped"
        break
    }
    1/$null
    "Function completed."
}

break_example
Error trapped
ParentContainsErrorRecordException:
Line |
   6 |      1/$null
     |      ~~~~~~~
     | Attempted to divide by zero.

문에 키워드가 trapbreak 포함되어 있기 때문에 함수가 계속 실행되지 않고 "Function completed" 줄이 실행되지 않습니다.

continue 문에 trap 키워드를 포함하면 break 또는 continue없는 것처럼 오류를 발생시킨 문 이후에 PowerShell이 다시 시작됩니다. 그러나 키워드를 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를 참조하세요.

참고하십시오