Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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
traputasításblokk feldolgozása és atraptartalmazó 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
ifvagyforeachhurokban) fordul elő, a blokkban lévőtraputasítások lefutnak, és a végrehajtás az alárendelt blokkon kívüli következő utasításban folytatódik.A
traptartalmazó szkript vagy függvény hibájának és megszakításának megjelenítése abreakutasítástraphasználatával.Elnémíthatja a hibát, de folytassa a
traptartalmazó szkript vagy függvény végrehajtását acontinueutasítástraphaszná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.