about_Try_Catch_Finally

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 }
}

Lásd még