about_Trap

Rövid leírás

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

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 a megszüntetési hiba esetén futtatandó utasítások listáját. trap az utasítások a következő módokon tudják kezelni a megszüntetési hibákat:

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

    Feljegyzés

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

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

  • Elnémíthatja a hibát, de folytathatja a szkript vagy függvény végrehajtását az trapcontinuetrap utasítás használatával.

Az utasításlista trap több feltételt vagy függvényhívást is tartalmazhat. Naplókat trap írhat, tesztelhet feltételeket, vagy akár egy másik programot is futtathat.

Syntax

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

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

Az trap utasítás tartalmazza a megszüntetési hiba esetén futtatandó utasítások listáját. Az 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 fogások hibáinak típusait trap .

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

Az összes megszűnési hiba túltöltése

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

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

trap { 'Error found.' }

Ez az 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 olyan utasítást trap tartalmaz, amely az automatikus változó használatával jeleníti meg a $_ hibát:

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 mindig érvényesek az adott szkriptblokk összes utasítására. Futásidőben trap a blokkokban lévő utasítások a többi utasítás végrehajtása előtt lesznek definiálva. A JavaScriptben ezt emelésnek nevezzük. Ez azt jelenti, hogy az 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 határoz meg egy trap hibát, és az első utasításban hibát ad meg, az trapazt aktiválja.

Konkrét hibák túltöltése

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

Az alábbi példa egy trap utasítás, amely a CommandNotFoundException adott hibájá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 meg egy ismert paranccsal, ez az trap utasítás megjeleníti a sztringet Command error trapped . Az utasításlista futtatása után a trap PowerShell írja a hibaobjektumot a hibastreambe, majd folytatja a szkriptet.

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

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

A CommandNotFoundException hibatípus a System.Exception típustól öröklődik. 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 trap több utasítás is szerepelhet. Csak egy trap utasítás képes az egyes hibatípusok csapdába ejtésében. Ha leállási hiba történik, a PowerShell a trap legspecifikusabb egyezést keresi, kezdve az aktuális szkriptvégrehajtási blokktal.

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

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 nonsenseString parancsmagként vagy más elemként, a 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 trap az utasításokat tartalmazza egy másik hibával:

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üntetési hibát csapdába ejt, az osztást nulla hibával csapdába ejti.

Túltöltési hibák egy szkriptblokkban

Alapértelmezés szerint a leállási hiba esetén a végrehajtás átkerül a trap utasításba. A blokk futtatása után a trap 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..0) {
   1/$x
   'after division'
}
'after loop'
0.333333333333333
after division
0.5
after division
1
after division
An error occurred!
RuntimeException:
Line |
   3 |     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 a szkriptblokk többi részét foreach , futtatja az try utasítást, és a szkriptblokk után foreach folytatódik.

Túltöltési hibák és hatókör

Ha az utasítással megegyező szkriptblokkban trap végződő hiba lép fel, a PowerShell futtatja a trap. A végrehajtás a hiba utáni utasításban 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 az trap utasítás a függvényben van, a szkript a következő utasításnál folytatódik. A következő szkript egy hibát és egy utasítást trap 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 trap függvényben lévő utasítás csapdába ejti a hibát. Az üzenet megjelenítése után a PowerShell folytatja a függvény futtatását. Figyelje meg, hogy az Function1trap utasítás után befejeződött.

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 az utasítás a trap függvényen kívül esik:

function function2 {
    NonsenseString
    'function2 was completed'
}

trap { 'An error:' }

function2

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

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 az trap utasítás kívül esik a függvényen. A PowerShell nem lép vissza a függvénybe az trap utasítás futtatása után.

Figyelemfelhívás

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.

A következő példában csak a trap futtatásokkal rendelkezők whoops 1 .

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

Fontos

Az trap utasítás hatóköre a fordítási helyre terjed ki. Ha egy függvényen vagy pont forráskódon belül van egy trap utasítás, a függvény vagy pont forrású szkript kilépésekor az összes trap benne lévő utasítás el lesz távolítva.

A törés és a kulcsszavak folytatása

Az utasításban szereplő trap kulcsszavak és continue kulcsszavak break 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 egy utasítást break belefoglal egy trap utasításlistába, a PowerShell leállítja a függvényt vagy a szkriptet. A következő mintafüggvény a kulcsszót break 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 az trap utasítás tartalmazza a kulcsszót break , a függvény nem fut tovább, és a Function completed sor nem fut.

Ha egy kulcsszót is belefoglal egy continuetrap utasításba, a PowerShell a hibát okozó utasítás után folytatódik, ugyanúgy, ahogy az nélkül break vagy continuenélküle is. A kulcsszó esetében azonban a continue PowerShell nem ír hibát a hibastreambe.

A következő mintafüggvény a kulcsszót continue használja egy trap utasításban:

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

continue_example
Error trapped
Function completed.

A függvény a hiba beszorulása után folytatódik, és az Function completed utasítás fut. A rendszer nem ír hibát a hibastreambe.

Jegyzetek

trap utasításokkal biztosíthatja, hogy a szkriptblokkon belüli összes megszüntetési hiba kezelhető legyen. A részletesebb hibakezelés érdekében használjon try/catch olyan blokkokat, amelyekben a trapek utasítások használatával vannak definiálva.catch Az catch utasítások csak a társított try utasításon belüli kódra vonatkoznak. További információ: about_Try_Catch_Finally.

Lásd még