about_Try_Catch_Finally
Rövid leírás
Ismerteti, hogyan használható a try
, catch
és finally
blokkok a megszüntetési hibák kezelésére.
Hosszú leírás
A try
parancsprogramokban catch
a , és finally
a blokkok használatával válaszolhat vagy kezelhet megszakítási hibákat. Az Trap
utasítás a szkriptek végződési hibáinak kezelésére is használható. További információ: about_Trap.
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 az aktuális folyamat használatával is leállítja a függvény vagy szkript futtatását. Más nyelvekben, például a C#-ban a megszüntetési hibákat kivételeknek nevezzük.
try
A 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 megkeres egy blokkot catch
a hiba kezeléséhez. Ha az 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. catch
Ha a blokk befejeződött, 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. A catch
blokkok meg tudják adni, hogy mely hibatípusokat kapja meg. Az try
utasítások több catch
blokkot is tartalmazhatnak különböző típusú hibákhoz.
A finally
blokkok olyan erőforrások felszabadítására használhatók, amelyekre már nincs szüksége a szkriptnek.
try
, catch
és hasonlít a try
C# programozási nyelvben használt , catch
és finally
kulcsszavakra.finally
Syntax
Az try
utasítás tartalmaz egy blokkot try
, nulla vagy több catch
blokkot, valamint nulla vagy egy finally
blokkot. Az try
utasításnak legalább egy catch
blokktal vagy blokktal finally
kell rendelkeznie.
Az alábbiakban a blokk szintaxisa try
látható:
try {<statement list>}
A try
kulcsszót egy kapcsos zárójelben lévő utasításlista követi. 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 blokkból egy try
megfelelő catch
blokkba.
Az alábbiakban a blokk szintaxisa catch
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 blokkban megszűnő hiba történik, a PowerShell megkeresi a try
megfelelő catch
blokkot. Ha talál ilyet, a rendszer végrehajtja a catch
blokkban lévő utasításokat.
A catch
blokk megadhat egy vagy több hibatípust. A hibatípus egy Microsoft .NET-keretrendszer kivétel, vagy egy .NET-keretrendszer kivételből származó kivétel. A catch
blokkok a megadott .NET-keretrendszer kivételosztály vagy a megadott osztályból származó bármely osztály hibáit kezelik.
Ha egy catch
blokk hibatípust ad meg, az a catch
blokk kezeli az adott hibatípust. Ha egy catch
blokk nem ad meg hibatípust, az a catch
blokk kezeli a try
blokkban előforduló hibákat. Egy try
utasítás több catch
blokkot is tartalmazhat a különböző megadott hibatípusokhoz.
Az alábbiakban a blokk szintaxisa finally
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 az try
utasítás hiba nélkül futott, vagy egy utasítás hibát észlelt catch
.
Vegye figyelembe, hogy a CTRL C billentyű 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 C billentyűkombináció+lenyomása után sem jelenik meg, még akkor sem, ha a finally
blokk futott.
Hibák észlelése
Az alábbi példaszkript egy try
blokkot tartalmazó blokkot catch
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
Az try
utasítások tetszőleges számú blokkot tartalmazhatnak catch
. A következő szkript például letölt MyDoc.doc
egy try
blokkot, amely két catch
blokkot tartalmaz:
try {
$wc = new-object System.Net.WebClient
$wc.DownloadFile("http://www.contoso.com/MyDoc.doc","c:\temp\MyDoc.doc")
}
catch [System.Net.WebException],[System.IO.IOException] {
"Unable to download MyDoc.doc from http://www.contoso.com."
}
catch {
"An error occurred that could not be resolved."
}
Az első catch
blokk a System.Net.WebException és a System.IO.IOException típus hibáit kezeli. 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
blokkok a megadott .NET-keretrendszer kivételosztály vagy a megadott osztályból származó bármely osztály hibáit kezelik. Az alábbi példa egy olyan blokkot catch
tartalmaz, amely a "Parancs nem található" hibaüzenetet kapja:
catch [System.Management.Automation.CommandNotFoundException]
{"Inherited Exception" }
A megadott hibatípus, a CommandNotFoundException a System.SystemException típustól öröklődik. 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 a 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 catch
származtatott osztály blokkját az catch
általános osztály blokkja elé.
Feljegyzés
A PowerShell a RuntimeException típus összes kivételét körbefuttatja. Ezért a System.Management.Automation.RuntimeException hibatípus megadása ugyanúgy viselkedik, mint egy nem minősített fogási blokk.
Traps használata a Try Catchben
Ha egy blokkban egy adott blokkban try
Trap
try
megszűnik a hiba, még akkor is, ha van egyező catch
blokk, az utasítás átveszi az Trap
irányítást.
Ha az Trap
aktuális hatókörön try
belül nem található egyező catch
blokk, akkor a rendszer akkor is átveheti az Trap
irányítást, ha a szülőhatókör egyező catch
blokkot használ.
Kivételadatok elérése
catch
Egy blokkon belül az aktuális hiba elérhető $_
az úgynevezett .$PSItem
Az objektum Type ErrorRecord típusú.
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 elérhető tulajdonságok is elérhetők, például a ScriptStackTrace, a Exception és az 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 blokkot finally
a catch
try
blokkok után. A finally
blokk-utasítások attól függetlenül futnak, hogy a try
blokk végződési hibába ütközik-e. A PowerShell futtatja a blokkot, finally
mielőtt a szkript leáll, vagy mielőtt az aktuális blokk kiesik a hatókörből.
A finally
blokk akkor is lefut, ha a CTRL C billentyűkombinációval+ állítja le a szkriptet. A finally
blokk akkor is lefut, ha egy kilépési kulcsszó leállítja a szkriptet egy catch
blokkon belülről.