Megosztás a következőn keresztül:


about_Trap

Rövid leírás

Egy kulcsszót ír le, amely végződési hibát kezel.

Hosszú leírás

A megszüntetési hiba leállítja az utasítás futtatását. Ha a PowerShell valamilyen módon nem kezeli a megszüntetési hibát, a PowerShell leállítja a függvény vagy szkript futtatását az aktuális folyamatban. Más nyelvekben, például a C#-ban a megszüntetési hibák kivételnek minősülnek.

A trap kulcsszó megadja azoknak az utasításoknak a listáját, amelyeket egy megszűnési hiba esetén kell futtatni. trap utasítások a következő módokon kezelhetik a megszüntetési hibákat:

  • A hiba megjelenítése a trap utasításblokk feldolgozása és a traptartalmazó szkript vagy függvény folyamatos végrehajtása után. Ez a viselkedés az alapértelmezett.

    Jegyzet

    Ha a megszüntetési hiba egy alárendelt utasításblokkban ( például utasításban if vagy foreach hurokban) fordul elő, a blokkban lévő trap utasítások lefutnak, és a végrehajtás az alárendelt blokkon kívüli következő utasításban folytatódik.

  • A trap tartalmazó szkript vagy függvény hibájának és megszakításának megjelenítése a break utasítás trap használatával.

  • Elnémíthatja a hibát, de folytassa a trap tartalmazó szkript vagy függvény végrehajtását a continue utasítás trap használatával.

A trap utasításlistája több feltételt vagy függvényhívást is tartalmazhat. A trap naplókat írhatnak, tesztelhetnek feltételeket, vagy akár egy másik programot is futtathatnak.

Szintaxis

A trap utasítás szintaxisa a következő:

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

A trap utasítás tartalmazza a megszüntetési hiba esetén futtatandó utasítások listáját. A trap utasítás a trap kulcsszóból áll, amelyet opcionálisan egy típuskifejezés követ, valamint az utasításblokkból, amely tartalmazza a hiba beszorulásakor futtatandó utasítások listáját. A típuskifejezés pontosítja a trap által kezelt hibák típusait.

Egy szkript vagy parancs több trap utasítással is rendelkezhet. trap utasítások bárhol megjelenhetnek a szkriptben vagy a parancsban.

Az összes befejező hiba kezelése

Ha egy szkriptben vagy parancsban más módon nem kezelt megszűnési hiba történik, a PowerShell egy trap utasítást keres, amely kezeli a hibát. Ha egy trap utasítás jelenik meg, a PowerShell továbbra is futtatja a szkriptet vagy parancsot a trap utasításban.

Az alábbi példa egy minimális trap utasítás:

trap { 'Error found.' }

Ez a trap utasítás minden megszüntetési hibát csapdába ejt.

A következő példában a függvény tartalmaz egy nonszensz sztringet, amely futásidejű hibát okoz.

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

TrapTest

A függvény futtatása a következő kimenetet adja vissza:

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.

Az alábbi példa egy utasítást trap tartalmaz, amely a hibát az $_ automatikus változó $PSItem használatával jeleníti meg:

function TrapTest {
    trap { "Error found: $_" }
    nonsenseString
}

TrapTest

A függvény ezen verziójának futtatása a következő kimenetet adja vissza:

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.

Fontos

trap az utasítások egy adott szkriptblokkon belül bárhol meghatározhatók, de a szkriptblokkban lévő összes utasításra mindig érvényesek. Futásidőben a blokkokban trap utasítások definiálva lesznek a többi utasítás végrehajtása előtt. Más nyelvekben, például a JavaScriptben ezt emelésnek nevezzük. Ez azt jelenti, hogy trap utasítások akkor is érvényesek a blokk összes utasítására, ha a végrehajtás nem haladta meg a definiálásuk pontját. Ha például egy szkript végén definiál egy trap, és az első utasításban hibaüzenetet ad, az továbbra is aktiválja a trap.

Specifikus hibák elfogása

Egy szkript vagy parancs több trap utasítással is rendelkezhet. Meghatározott hibák kezelésére trap definiálható.

Az alábbi példa egy trap utasítás, amely a CommandNotFoundExceptionadott hibát csapja le:

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

Ha egy függvény vagy szkript olyan sztringgel találkozik, amely nem egyezik egy ismert paranccsal, ez a trap utasítás megjeleníti a Command error trapped sztringet. A trap utasításlista futtatása után a PowerShell a hibaobjektumot a hibastreambe írja, majd folytatja a szkriptet.

A PowerShell .NET-kivételtípusokat használ. Az alábbi példa a hibatípust, a System.Exception jelöli meg:

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

A CommandNotFoundException hibatípus örökli a System.Exception típust. Ez az utasítás az ismeretlen parancsok által kiváltott hibákat csapdába ejti. Emellett más hibatípusokat is csapdába ejt.

A hibaobjektum vizsgálatával megtalálhatja a hiba kivételtípusát. Az alábbi példa bemutatja, hogyan szerezheti be a munkamenet utolsó hibájának kivételének teljes nevét:

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

Egy szkriptben több trap utasítás is szerepelhet. Csak egy trap utasítás képes minden hibatípust kezelni. Ha leállási hiba történik, a PowerShell a trap legspecifikusabb egyezést keresi, kezdve a végrehajtás aktuális szkriptblokkjával.

A következő példaszkript hibát tartalmaz. A szkript tartalmaz egy általános trap utasítást, amely a megszüntetési hibákat csapdába ejti, valamint egy adott trap utasítást, amely megadja a CommandNotFoundException típusát.

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

A szkript futtatása a következő eredményt hozza létre:

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.

Mivel a PowerShell nem ismeri fel a nonsenseString parancsmagként vagy más elemként, CommandNotFoundException hibát ad vissza. Az adott trap utasítás csapdába ejti ezt a megszüntető hibát.

A következő példaszkript ugyanazokat a trap utasításokat tartalmazza, amelyekben egy másik hiba szerepel:

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

A szkript futtatása a következő eredményt hozza létre:

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

A nullával való osztási kísérlet nem hoz létre CommandNotFoundException hibát. A másik trap utasítás, amely minden megszűnő hibát elkap, elkapja a nullával való osztási hibát is.

Túltöltési hibák szkriptblokkban

Alapértelmezés szerint a leállási hiba esetén a végrehajtás átkerül a trap utasításba. A trap blokk futtatása után a vezérlő visszatér a következő utasításblokkhoz a hiba helye után.

Ha például egy utasításban foreach végződő hiba történik, az trap utasítás lefut, és a végrehajtás a blokk utáni foreach következő utasításban folytatódik, nem pedig a foreach blokkon belül.

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

A kimenetben láthatja, hogy a hurkok az utolsó iterációig folytatódnak. Amikor a szkript 1-et próbál 0-ra osztani, a PowerShell leállási hibát jelez. A szkript kihagyja az utasítás többi részét foreach , futtatja az utasítást try , és az foreach utasítás után folytatódik.

Hibakezelés és hatókör

Ha a megszakítási hiba ugyanabban a szkriptblokkban fordul elő, mint az trap utasítás, a PowerShell az utasítás által trapdefiniált utasítások listáját futtatja. A végrehajtás a hibát követő utasításon folytatódik. Ha az trap utasítás a hibától eltérő szkriptblokkban található, a végrehajtás a következő utasításnál folytatódik, amely ugyanabban a szkriptblokkban található, mint az trap utasítás.

Ha például hiba történik egy függvényben, és a trap utasítás szerepel a függvényben, a szkript a következő utasításnál folytatódik. A következő szkript egy hibát és egy trap utasítást tartalmaz:

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

function1

A szkript futtatása a következő eredményt hozza létre:

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

A függvény trap utasítása csapdába ejti a hibát. Az üzenet megjelenítése után a PowerShell folytatja a függvény futtatását. Vegye észre, hogy Function1 a trap utasítás után fejeződött be.

Hasonlítsa össze ezt a viselkedést az alábbi példával, amely ugyanazzal a hibával és trap utasítással rendelkezik. Ebben a példában a trap utasítás a függvényen kívül történik:

function function2 {
    NonsenseString
    'function2 was completed'
}

trap { 'An error:' }

function2

A Function2 függvény futtatása a következő eredményt eredményezi:

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.

Ebben a példában a function2 was completed parancs nem fut. Mindkét példában a megszűnési hiba a függvényen belül következik be. Ebben a példában azonban a trap utasítás kívül esik a függvényen. A PowerShell nem lép vissza a függvénybe a trap utasítás futtatása után.

Figyelem

Ha ugyanahhoz a hibafeltételhez több trap is definiálva van, a rendszer az első trap definiált lexikális (a szkriptblokkban a legmagasabb) értéket használja.

Az alábbi példában csak a trap fut a whoops 1-el.

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

Fontos

A trap utasítás hatóköre a fordítási helyre terjed ki. Ha van trap utasítás egy függvényben vagy pontból származtatott szkriptben, akkor amikor a függvény vagy pontból származtatott szkript kilép, az összes trap utasítás eltávolításra kerül.

A break és continue kulcsszavak használata

A break utasításban szereplő continue és trap kulcsszavak segítségével megállapíthatja, hogy egy szkript vagy parancs továbbra is fut-e a megszakítási hiba után.

Ha break utasítást tartalmaz egy trap utasításlistában, a PowerShell leállítja a függvényt vagy a szkriptet. Az alábbi mintafüggvény a break kulcsszót használja egy trap utasításban:

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.

Mivel a trap utasítás tartalmazza a break kulcsszót, a függvény nem fut tovább, és a Function completed sor nem fut.

Ha egy continue kulcsszót is belefoglal egy trap utasításba, a PowerShell a hibát okozó utasítás után folytatja, ahogyan az break vagy continuenélkül is. A continue kulcsszóval azonban a PowerShell nem ír hibát a hibastreambe.

Az alábbi mintafüggvény a continue kulcsszót használja egy trap utasításban:

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

A függvény folytatódik a hiba kezelése után, és a End of function utasítás fut. A rendszer nem ír hibát a hibastreambe.

Jegyzetek

trap utasításokkal biztosítható, hogy a szkriptblokkon belüli összes megszüntetési hiba kezelhető legyen. Részletesebb hibakezeléshez használjon try/catch olyan blokkokat, amelyekben a trapek utasítások használatával vannak definiálva catch . A catch utasítások csak a társított try utasításon belüli kódra vonatkoznak. További információért lásd a about_Try_Catch_Finallyrészt.

Lásd még