Try / Catch blokk PowerShell, hogy kezelje a hibákat, amelyek a szkriptben. Pontosabban, a hibáknak meg kell szüntetniük a hibákat. A PowerShell végül blokkja nem kötelező minden alkalommal írni a try / Catch mellett, de végrehajtásra kerül, függetlenül attól, hogy a hiba bekövetkezik-e vagy sem.
tehát a Próbablokk használatakor a fogási blokk kötelező, de nem végül blokk.
-
Try / Catch blokk lezáró hiba − az alábbiakban a példa lezáró hiba nélkül végül blokk.,
példa
try{ This is not allowed "This is Allowed"}catch{ Write-Host "Error occured" -BackgroundColor DarkRed}
kimenet
a fenti példában van vissza valami, ami nem engedélyezett, de a következő sor valódi volt, bár a megszüntetési hiba miatt nem tudta végrehajtani.
célunk, hogy elkapjuk a Próbablokkban generált kivételt és hibaüzenetet. Mint tudjuk, a hibát a $Error változó tárolja. Ha ellenőrzi a $error változó kimenetét, megkaphatja a teljes nézetet, de amikor bármilyen szkriptet futtat, és kezeli a hibákat, győződjön meg róla, hogy a $error segítségével törli a régi hibákat.,törölje a () parancsot, vagy használja az új PowerShell konzolt. Abban az esetben, ha ismeri az adott hiba változó helyét egy tömbben, akkor ezt közvetlenül használhatja. Például a $error
láthatjuk, hogy mi a $Error változó összes tulajdonsága.
PS C:\WINDOWS\system32> $Error | Get-Member | Select Name, MemberTypeName MemberType---- ----------Equals MethodGetHashCode MethodGetObjectData MethodGetType MethodToString MethodCategoryInfo PropertyErrorDetails PropertyException PropertyFullyQualifiedErrorId PropertyInvocationInfo PropertyPipelineIterationInfo PropertyScriptStackTrace PropertyTargetObject PropertyPSMessageDetails ScriptProperty
kevés fenti tulajdonság segít megtalálni a kivétel és a hiba részleteit. Hadd lássam őket, és kihasználhatjuk őket a fogási blokkban is.
első InvocationInfo tulajdonság., Ön is használja a $Hiba, de ez az egyetlen hiba keletkezett eddig használjuk közvetlenül $Hiba, de nem tudja, hogy az Autoszuggesztió Felugró $error változó közvetlenül.
PS C:\WINDOWS\system32> $Error.InvocationInfoMyCommand :BoundParameters : {}UnboundArguments : {}ScriptLineNumber : 3OffsetInLine : 5HistoryId : 50ScriptName :Line : This is not allowedPositionMessage : At line:3 char:5 + This is not allowed + ~~~~PSScriptRoot :PSCommandPath :InvocationName : ThisPipelineLength : 0PipelinePosition : 0ExpectingInput : FalseCommandOrigin : InternalDisplayScriptPosition :
a konkrét információkat a Line and PositionMessage-ből kaphatja meg az alábbiak szerint.
ellenőrizze most a kivétel tulajdonságait.
PS C:\WINDOWS\system32> $Error.ExceptionThe term 'This' 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.
kivétel üzenet
PS C:\WINDOWS\system32>$error.Exception.MessageThe term 'This' 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.
használhatja a többi tulajdonságot, amely szerint hasznos lesz a hibaüzenet megjelenítéséhez. Ezek közül néhányat fogunk használni a fogási blokkban, hogy elkapjuk a hibát., Ahogy dolgozunk a jelenlegi hiba fogjuk használni$_. az aktuális hiba/Kivétel kezelése.
Output
Error Message: The term 'This' 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.Error in Line: This is not allowedError in Line Number: 3Error Item Name:
ahogy fentebb láttuk, nem volt végül blokk, de a try/Catch folytatta a munkát. Felveheti a végül blokk, hogy törölje a változók, hibák, valamint megjeleníti az üzenetet.
-
Try / Catch blokk nem záró hiba.,
Mint láttuk a fenti példa, hogy a hibák Megszüntetéséről szabályozható a try/Catch blokk, de Nem hibák Megszüntetéséről nem, mert beépített parancsmagokat, függvények által generált hibák, illetve az alapértelmezett beállítást a Hiba a művelet Folytatódik, ezért a következő parancs továbbra is fut még akkor is, ha a hiba nem kezelte.
PS C:\WINDOWS\system32> $ErrorActionPreferenceContinue
a nem végződő hiba kényszerítéséhez meg kell változtatnunk a $ErrorActionPreference változót a leállításhoz, vagy meg kell használnunk az Erroraction paramétert a Stop értékkel., Itt a ErrorAction paramétert fogjuk használni, mivel szükségünk van rá egy adott parancshoz, nem pedig a teljes szkripthez.
Példa
Kimenet
Error Message: Cannot find any service with service name 'WhichService'.Error in Line: Get-Service WhichService -ErrorAction StopError in Line Number: 4Error Item Name:This is going to run anyway
Mint látható a fenti példában a Get-Service termel, az nem hiba megszüntetéséről, valamint tudjuk alakítani, megszüntetése a hiba által –ErrorAction Ne paraméter ugyanaz a kivétel elkapta Catch Blokk.
-
speciális kivétel kézi kezelése
Ha egy adott típusú kivételt szeretne kezelni, akkor megadhatja a kivétel nevét a fogási blokkban., A kivétel nevének megismeréséhez meg kell szereznie a $Error változó tulajdonságát, ez pedig GetType(). Az alábbi példában meg kell találnunk A kivétel nevét az alábbi hibakimenetből.
példa
tegyük fel, hogy a hibát $Error variable tárolja, a parancs alatt kell futtatnia, hogy megkapja a kivétel nevét a catch block használatához.
$Error.Exception.GetType().FullName
PS C:\WINDOWS\system32> $Error.Exception.GetType().FullNameSystem.Management.Automation.MethodInvocationException
megkapta a kivétel típusnevét a fenti paranccsal, ugyanazt használhatja a fogási blokkban, így a fogási blokk csak ezt a konkrét kivételt fogja elkapni.,
Output
-
Catch Multiple Exception PowerShell.
a többszörös kivételeket a PowerShellben is elkaphatja. Ehhez, akkor egy próbát blokk Több fogás blokkok.
példa
kimenet
Cannot find path 'C:\temp\cominfo1.html' because it does not exist.Setting up ErrorActionPreference to the Default value
itt az első parancsban maga a hiba keletkezett, így a következő parancs nem fog végrehajtani. Ha az első parancs nem generál hibát, akkor a következő parancs kerül ellenőrzésre, és ha a kivétel bekövetkezik, akkor a Catch ezzel az adott kivétel blokk végrehajtásra kerül.,
ha nem akar több kivételt kezelni, és még mindig szüksége van néhány parancsra, a hibák figyelmen kívül hagyhatók, de nem szabad áthaladniuk a catch block-on, így a következő parancs végrehajtható, akkor használhatja a figyelmen kívül hagyást vagy a SilentlyIgnore-t az ErrorAction paraméterben.