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
Ez a cikk azt ismerteti, hogyan használhatja a try, catchés finally blokkokat az utasítás-megszakítási és szkript-megszakítási hibák kezelésére.
Hosszú leírás
Használjon try, catchés finally blokkokat a szkriptek leállási hibáinak megválaszolásához vagy kezeléséhez. A PowerShell kétféle megszüntetési hibával rendelkezik:
- utasítás-megszüntetési hibák, amelyek leállják az aktuális utasítást, és
- szkript-megszakítási hibák, amelyek a teljes hívásverem visszatekerését okozták
Mindkét típust elkapja a try/catch. Az utasítással trap megszüntetési hibákat is kezelhet. További információ: about_Trap. Az összes hibatípus átfogó áttekintéséhez tekintse meg a about_Error_Handling.
Egy utasítás-megszüntetési hiba leállítja az aktuális utasítás futtatását, de a PowerShell a következő utasításnál folytatja, kivéve, ha a hiba szkriptvégzéssel is végződik. A szkriptleállási hiba (például a kulcsszó által generált hiba) leállítja a throw teljes szkriptet, kivéve, ha egy try/catch blokk vagy trap utasítás nem jelenik meg.
Jegyzet
$ErrorActionPreferenceletilthatja a .. parancs throw Ha be van SilentlyContinue állítva vagy Ignore, a hiba nem propagálja a hibát, és a végrehajtás a következő utasításnál folytatódik. További részletekért tekintse meg a about_Error_Handling szkript-megszüntetési hibáit ismertető szakaszt.
A try blokk használatával definiálhatja egy szkript azon szakaszát, amelyben a PowerShell figyeli a hibákat. Ha hiba történik a try blokkon belül, a rendszer először menti a hibát az $Error automatikus változóba. A PowerShell ezután keres egy catch-blokkot a hiba kezeléséhez. Ha a try utasítás nem rendelkezik egyező catch blokktal, a PowerShell továbbra is keres egy megfelelő catch blokkot vagy trap utasítást a szülő hatókörökben. Ha egy catch blokk befejeződik, vagy ha nem található megfelelő catch blokk vagy trap utasítás, a finally blokk lefut. Ha a hiba nem kezelhető, a hiba a hibastreambe lesz írva.
A catch blokkok tartalmazhatnak parancsokat a hiba nyomon követéséhez vagy a szkript várt folyamatának helyreállításához. Egy catch blokk megadhatja, hogy mely hibatípusokat kapja meg. A try utasítás több catch blokkot is tartalmazhat a különböző típusú hibákhoz.
A finally blokkokkal felszabadíthatja a szkript által már nem szükséges erőforrásokat.
try, catchés finally hasonlít a C# programozási nyelvben használt try, catchés finally kulcsszavakra.
Szemantika
A try utasítás tartalmaz egy try blokkot, egy vagy több catch blokkot, valamint egy vagy egy finally blokkot. A try utasításnak legalább egy catch blokktal vagy egy finally blokktal kell rendelkeznie.
Az alábbiakban a try blokk szintaxisa látható:
try {<statement list>}
A try kulcsszót egy utasításlista követi kapcsos zárójelekben. Ha az utasításlistában szereplő utasítások futtatása közben megszűnő hiba történik, a szkript átadja a hibaobjektumot a try blokkból egy megfelelő catch blokkba.
Az alábbiakban a catch blokk szintaxisa látható:
catch [[<error type>][',' <error type>]*] {<statement list>}
A hibatípusok szögletes zárójelekben jelennek meg. A legkülső zárójelek azt jelzik, hogy az elem nem kötelező.
A catch kulcsszót a hibatípus-specifikációk opcionális listája és egy utasításlista követi. Ha a try blokkban végződő hiba lép fel, a PowerShell megkeresi a megfelelő catch blokkot. Ha talál egyet, a catch blokkban lévő utasítások végrehajtása történik.
A catch blokk megadhat egy vagy több hibatípust. A hibatípus a Microsoft .NET-keretrendszer kivétele, vagy egy .NET-keretrendszer kivételéből származó kivétel. A catch blokk kezeli a megadott .NET-keretrendszer kivételosztályának vagy a megadott osztályból származó bármely osztály hibáit.
Ha egy catch blokk egy hibatípust határoz meg, az catch blokk kezeli ezt a hibatípust. Ha egy catch blokk nem ad meg hibatípust, az catch blokk kezeli a try blokkban előforduló hibákat. A try utasítás több catch blokkot is tartalmazhat a különböző megadott hibatípusokhoz.
Az alábbiakban a finally blokk szintaxisa látható:
finally {<statement list>}
A finally kulcsszót egy utasításlista követi, amely a szkript minden futtatásakor fut, még akkor is, ha a try utasítás hiba nélkül futott, vagy hiba történt egy catch utasításban.
Vegye figyelembe, hogy a CTRL+C lenyomásával leállítja a folyamatot. A folyamatnak küldött objektumok nem jelennek meg kimenetként. Ezért ha egy megjelenítendő utasítást (például "A blokk futtatása befejeződött") tartalmaz, akkor a ctrl +Clenyomása után sem jelenik meg, még akkor sem, ha a finally blokk lefutott.
Hibák észlelése
Az alábbi példaszkript egy try blokkot tartalmazó catch blokkot mutat be:
try { NonsenseString }
catch { "An error occurred." }
A catch kulcsszónak azonnal követnie kell a try blokkot vagy egy másik catch blokkot.
A PowerShell nem ismeri fel a "NonsenseString" parancsmagot vagy egyéb elemet. A szkript futtatása a következő eredményt adja vissza:
An error occurred.
Amikor a szkript "Nonszenszstring" hibába ütközik, az végződési hibát okoz. A catch blokk úgy kezeli a hibát, hogy a blokkon belül futtatja az utasításlistát.
TÖBB FOGÁSI UTASÍTÁS HASZNÁLATA
A try utasításnak tetszőleges számú catch blokkja lehet. A következő szkript például egy try blokkot tartalmaz, amely letölti MyDoc.doc, és két catch blokkot tartalmaz:
try {
$wc = New-Object System.Net.WebClient
$wc.DownloadFile("https://httpbin.org/MyDoc.doc","C:\temp\MyDoc.doc")
} catch [System.Net.WebException],[System.IO.IOException] {
"Unable to download MyDoc.doc from https://httpbin.org."
} catch {
"An error occurred that could not be resolved."
}
Az első catch blokk kezeli a System.Net.WebException és System.IO.IOException típusú hibáit. A második catch blokk nem ad meg hibatípust. A második catch blokk kezeli az esetlegesen előforduló egyéb megszűnési hibákat.
A PowerShell öröklés szerint egyezik a hibatípusokkal. A catch blokk kezeli a megadott .NET-keretrendszer kivételosztályának vagy a megadott osztályból származó bármely osztály hibáit. Az alábbi példa egy catch blokkot tartalmaz, amely "Nem található parancs" hibaüzenetet kap:
catch [System.Management.Automation.CommandNotFoundException] {
"Inherited Exception"
}
A megadott hibatípus( CommandNotFoundException) a System.SystemException típustól örökli. Az alábbi példa a Nem található parancs hibát is észleli:
catch [System.SystemException] {"Base Exception" }
Ez a catch blokk kezeli a "Parancs nem található" hibát és az SystemException típustól öröklő egyéb hibákat.
Ha egy hibaosztályt és annak egyik származtatott osztályát adja meg, helyezze a származtatott osztály catch blokkját az általános osztály catch blokkja elé.
Jegyzet
A PowerShell egy RuntimeException típus összes kivételét körbefuttatja. Ezért a hibatípus megadása System.Management.Automation.RuntimeException ugyanúgy viselkedik, mint egy nem minősített fogási blokk.
Traps használata egy próbafogásban
Ha egy try blokkban megszűnik a trap blokkban definiált try, még akkor is, ha egyező catch blokk található, a trap utasítás átveszi az irányítást.
Ha egy trap a try-nél magasabb blokkban található, és az aktuális hatókörön belül nincs egyező catch blokk, a trap akkor is átveheti az irányítást, ha bármely szülőhatókörhöz egyező catch blokk tartozik.
Kivételadatok elérése
catch Egy blokkon belül az aktuális hiba az vagy $_ az $PSItem automatikus változó használatával érhető el. Az objektum típusa ErrorRecord.
try { NonsenseString }
catch {
Write-Host "An error occurred:"
Write-Host $_
}
A szkript futtatása a következő eredményt adja vissza:
An Error occurred:
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.
További tulajdonságok érhetők el, például ScriptStackTrace, Exceptionés ErrorDetails. Ha például a szkriptet a következőre módosítjuk:
try { NonsenseString }
catch {
Write-Host "An error occurred:"
Write-Host $_.ScriptStackTrace
}
Az eredmény a következőhöz hasonló lesz:
An Error occurred:
at <ScriptBlock>, <No file>: line 2
Erőforrások felszabadítása végül
A szkriptek által használt erőforrások felszabadításához adjon hozzá egy finally blokkot a try és catch blokkok után. A finally blokkok attól függetlenül futnak, hogy a try blokk végződési hibába ütközik-e. A PowerShell futtatja a finally blokkot, mielőtt a szkript leáll, vagy mielőtt az aktuális blokk kikerül a hatókörből.
A finally blokk akkor is lefut, ha CTRL+C használatával állítja le a szkriptet. A finally blokk akkor is lefut, ha egy exit kulcsszó leállítja a szkriptet egy catch blokkon belülről.
Az alábbi példában a try letiltja a fájl letöltését a C:\temp mappába. A catch blokkok kezelik a letöltés során előforduló hibákat. A finally blokk eltávolítja a WebClient objektumot, és eltávolítja az ideiglenes fájlt, ha létezik.
try {
$wc = New-Object System.Net.WebClient
$tempFile = "C:\temp\MyDoc.doc"
$wc.DownloadFile("https://httpbin.org/MyDoc.doc",$tempFile)
} catch [System.Net.WebException],[System.IO.IOException] {
"Unable to download MyDoc.doc from https://httpbin.org."
} catch {
"An error occurred that could not be resolved."
} finally {
$wc.Dispose()
if (Test-Path $tempFile) { Remove-Item $tempFile }
}