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 tryparancsprogramokban catcha , é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 tryC# 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.docegy 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 tryTraptry 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 trybelü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 catchtry 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.

Lásd még