다음을 통해 공유


about_Trap

간단한 설명

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

자세한 설명

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

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

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

    참고 항목

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

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

  • 오류를 무음으로 처리하지만 문에서 trap 사용하여 continue 스크립트 또는 함수를 trap 계속 실행합니다.

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

구문

trap 문의 구문은 다음과 같습니다.

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

이 문에는 trap 종료 오류가 발생할 때 실행할 문 목록이 포함됩니다. 문은 trap 키워드로 구성되며, 필요에 따라 형식 식과 오류가 트래핑될 때 실행할 문 목록이 포함된 문 블록으로 구성 trap 됩니다. 형식 식은 catch하는 오류 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 a name of a cmdlet,
function, script file, or executable 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 a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.

Important

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

특정 오류 트래핑

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

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

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

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

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

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

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

오류 개체를 검사하여 오류에 대한 예외 유형을 찾을 수 있습니다. 다음 예제에서는 세션의 마지막 오류에 대한 예외의 전체 이름을 가져오는 방법을 보여줍니다.

nonsenseString
$Error[0].Exception.GetType().FullName
nonsenseString: The term 'nonsenseString' is not recognized as a name of a
cmdlet, function, script file, or executable program. Check the spelling
of the name, or if a path was included, verify that the path is correct
and try again.

System.Management.Automation.CommandNotFoundException

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

다음 스크립트 예제에는 오류가 포함되어 있습니다. 스크립트에는 종료 오류를 트래핑하는 일반 trap 문과 CommandNotFoundException 형식을 지정하는 특정 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 a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.

PowerShell은 cmdlet 또는 다른 항목으로 인식 nonsenseString 되지 않으므로 CommandNotFoundException 오류를 반환합니다. 특정 trap 문은 이 종료 오류를 트래핑합니다.

다음 스크립트 예제에는 다른 오류가 있는 동일한 trap 문이 포함되어 있습니다.

trap { 'Other terminating error trapped' }
trap [System.Management.Automation.CommandNotFoundException] {
    'Command error trapped'
}
1/$null

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

Other terminating error trapped
RuntimeException:
Line |
   5 |  1/$null
     |  ~~~~~~~
     | Attempted to divide by zero.

0으로 나누려고 시도해도 CommandNotFoundException 오류가 발생하지 않습니다. 종료 오류를 트래핑하는 다른 trap 문은 0 오류로 나누기를 트래핑합니다.

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

기본적으로 종료 오류가 throw되면 실행이 트랩 문으로 전송됩니다. 블록이 trap 실행되면 컨트롤은 오류 위치 후 다음 문 블록으로 돌아갑니다.

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

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

출력에서 루프가 마지막 반복까지 계속되는 것을 볼 수 있습니다. 스크립트가 1을 0으로 나누려고 하면 PowerShell에서 종료 오류가 발생합니다. 스크립트는 스크립트 블록의 foreach 나머지 부분을 건너뛰고, 문을 실행하고 try , 스크립트 블록 후에 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 a name of a cmdlet,
function, script file, or executable 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 비교합니다. 이 예제에서 문은 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 a name of a cmdlet,
function, script file, or executable 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 }

Important

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

중단 및 계속 키워드 사용

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

문 목록에 문을 trap 포함 break 하면 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.

문에 trap 키워드가 break 포함되어 있으므로 함수가 계속 실행되지 않고 줄이 Function completed 실행되지 않습니다.

문에 키워드를 continue trap 포함하면 오류가 발생한 문 이후에 PowerShell이 다시 시작 break 됩니다 continue. 그러나 키워드를 continue 사용하면 PowerShell에서 오류 스트림에 오류를 기록하지 않습니다.

다음 샘플 함수는 문에서 continue 키워드를 trap 사용합니다.

function ContinueExample {
    trap {
        'Error trapped'
        continue
    }
    foreach ($x in 3..-1) {
       "1/$x = "
       "`t$(1/$x)"
    }
    'End of function'
}

ContinueExample
1/3 =
        0.333333333333333
1/2 =
        0.5
1/1 =
        1
1/0 =
Error trapped
End of function

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

주의

trap 문은 스크립트 블록 내의 모든 종료 오류를 처리하는 방법을 제공합니다. 보다 세분화된 오류 처리를 위해 문을 사용하여 트랩이 정의된 블록을 사용합니다trycatch/.catch 문은 catch 연결된 문 내의 코드에만 적용됩니다 try . 자세한 내용은 about_Try_Catch_Finally 참조하세요.

참고 항목