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


A trapről

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 megszakítá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. A trap utasítások kezelik a megszakítási hibákat, és lehetővé teszik a szkript vagy függvény végrehajtásának folytatását a leállítás helyett.

A trap utasítások összetettebbek is lehetnek. A trap utasításlistája több feltételt vagy függvényhívást is tartalmazhat. A trap naplókat írhat, tesztelheti a feltételeket, vagy akár egy másik programot is futtathat.

Szemantika

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

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

A Trap utasítás tartalmazza a lemondá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 a hiba csapdázása esetén futtatandó utasítások listáját tartalmazó utasításblokkból. A típuskifejezés finomítja a trap által észlelt hibák típusait.

Egy szkript vagy parancs több Trap utasítást is tartalmazhat. A trap utasítások bárhol megjelenhetnek a szkriptben vagy a parancsban.

Az összes befejező hiba kezelése

Ha olyan megszakítási hiba történik, amelyet egy szkript vagy parancs nem kezel más módon, a PowerShell ellenőrzi a hibát kezelő Trap utasítást. Ha van Trap utasítás, a PowerShell továbbra is futtatja a szkriptet vagy parancsot a Trap utasításban.

Az alábbi példa egy nagyon egyszerű Trap utasítás:

trap {"Error found."}

Ez a trap utasítás csapdába ejti a megszakítási hibákat.

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őket adja vissza:

Error found.

Az alábbi példa egy Trap utasítást 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őket 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 then try
again.

Fontos

A trap utasítások egy adott hatókörön belül bárhol definiálhatók, de mindig az adott hatókör összes utasítására vonatkoznak. Futásidőben a blokkban lévő trapek definiálása a többi utasítás végrehajtása előtt történik. A JavaScriptben ezt hoistingnéven ismerik. Ez azt jelenti, hogy a trapek a blokk összes utasítására vonatkoznak, még akkor is, ha a végrehajtás nem haladta túl a definiált pontot. Ha például egy parancsfájl végén definiál egy trapet, és hibát dob az első utasításban, az továbbra is kiváltja a trapet.

Specifikus hibák elfogása

Egy szkript vagy parancs több Trap utasítást is tartalmazhat. A túltöltések meghatározott hibák kezelésére definiálhatók.

Az alábbi példa egy Trap utasítás, amely csapdába ejti a CommandNotFoundException hibát:

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

Ha egy függvény vagy szkript olyan karakterlánccal találkozik, amely nem felel meg egy ismert parancsnak, ez a Trap utasítás a "Command error traped" karakterláncot jeleníti meg. A Trap utasításlista futtatása után a PowerShell a hibaobjektumot a hibastreambe írja, majd folytatja a szkriptet.

A PowerShell a Microsoft .NET Framework kivételtípusokat használja. 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 egy ismeretlen parancs által létrehozott hibát csapdáz fel. Emellett más hibatípusokat is csapdába ejt.

Egy szkriptben több Trap utasítás is lehet. Az egyes hibatípusokat csak egy Trap utasítás csapdába ejtheti. Megszakítási hiba esetén a PowerShell megkeresi a legkonkrétabb egyezéssel rendelkező trapet a végrehajtás aktuális hatókörétől kezdve.

A következő példaszkript hibát tartalmaz. A szkript tartalmaz egy általános Trap utasítást, amely csapdába ejti a megszakítási hibákat, valamint egy adott Trap utasítást, amely meghatározza 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 : 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

Mivel a PowerShell nem ismeri fel a "nonsenseString" parancsmagot vagy más elemet, CommandNotFoundException hibát ad vissza. Ezt a megszakítási hibát az adott Trap utasítás csapdába ejti.

Az alábbi szkriptpélda ugyanazokat a Trap 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
Attempted to divide by zero.
At C:\temp\test\traptest.ps1:5 char:1
+ 1/$null
+ ~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException

A nullával való osztás kísérlete nem hoz létre CommandNotFoundException hibát. Ehelyett ezt a hibát a másik Trap utasítás csapdába ejti, amely csapdába ejti a megszakítási hibákat.

Hibakezelés és hatókör

Ha a Trap utasítással azonos hatókörben megszakítási hiba történik, a PowerShell futtatja a trap által meghatározott utasítások listáját. A végrehajtás a hibát követő utasításon folytatódik. Ha a Trap utasítás a hibától eltérő hatókörben van, a végrehajtás a következő utasításnál folytatódik, amely ugyanabban a hatókörben van, mint a Trap utasítás.

Ha például hiba történik egy függvényben, és a 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 trap utasítást tartalmaz:

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

A szkript későbbi részében a függvény1 futtatása a következő eredményt eredményezi:

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

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 figyelembe, hogy befejeződött Function1 .

Hasonlítsa össze ezt az alábbi példával, amely ugyanazt a hibát és Trap utasítást tartalmazza. Ebben a példában a trap utasítás a függvényen kívül fordul elő:

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:
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 <<<<

Ebben a példában a "function2 befejeződött" parancs nem futott. 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 tér vissza a függvénybe a Trap utasítás futtatása után.

Figyelmeztetés

Ha ugyanahhoz a hibafeltételhez több túltöltés van definiálva, a rendszer a lexikálisan definiált első trapet használja (a hatókör legmagasabb).

A következő példában csak a "hoppá 1" trap fut.

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

Az és kulcsszavak continue használata break

A Break és a Continue kulcsszavak használatával meghatározhatja, hogy egy parancsfájl vagy parancs továbbra is fut-e egy leállítási hiba után.

Ha egy utasítást tartalmaz Break egy Trap utasításlistában, a PowerShell leállítja a függvényt vagy 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
Attempted to divide by zero.
At line:4 char:7

Mivel a Trap utasítás tartalmazta a Break kulcsszót, a függvény nem fut tovább, és a "Function completed" sor nem fut.

Ha utasítást ad Continue meg egy Trap utasításban, a PowerShell a hibát okozó utasítás után folytatódik, ugyanúgy, mint anélkül Break , hogy vagy Continue. Continue A 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 continue_example {
    trap {
        "Error trapped"
        continue
    }
    1/$null
    "Function completed."
}

continue_example
Error trapped
Function completed.

A függvény a hiba csapdázása után folytatódik, és a "Függvény befejeződött" utasítás fut. A rendszer nem ír hibát a hibastreambe.

Jegyzetek

A trap-utasítások egyszerű módot biztosítanak a hatókörön belüli összes lezárási hiba kezelésének széles körű biztosítására. A részletesebb hibakezelés érdekében használjon try/catch blokkokat, amelyekben a trapek Catch utasítások használatával vannak definiálva. 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

about_Break

Folytatás

about_Scopes

about_Throw

a Try_Catch_Finally kezelése