Megszakító és nem megszakító hibák

Elsőként nézzünk pár fogalmat. A PowerShellben két hibafajta van, a „terminating error ”, azaz a futást mindenképpen megszakító, és a „nonterminating error ”, azaz a futást nem feltétlenül megszakító hiba.

Megszakító hibák például a szintaktikai hibák, amikor elgépelünk valamit. Vagy például amikor nullával szeretnénk osztani. Mi magunk is generálhatunk ilyen hibákat a korábban már látott throw  kulcsszóval, amikor például egy függvényünknek nem ad át a felhasználó minden fontos paramétert.

Előfordulhatnak olyan hibák, amelyek előállásakor nem kívánjuk, hogy a szkript futása megszakadjon, de azért szeretnénk értesülni ezekről. Ez főleg olyan cmdleteknél és függvényeknél jöhet jól, amelyek csőelemeket dolgoznak fel, és egy-két csőelem esetében megengedjük, hogy ne fusson le a szkript, de azért a többi elemre nyugodtan próbálkozzon.

Nézzünk példát a kétfajta hibára, elsőként a megszakító hibára, rögtön két példát is:

[7] PS C:\old> "Eleje"; 15/0; "Vége"

Attempted to divide by zero.

At line:1 char:13

+ "Eleje"; 15/ <<<< 0; "Vége"

    + CategoryInfo          : NotSpecified: (:) [], ParentContainsErrorRecord

   Exception

    + FullyQualifiedErrorId : RuntimeException

A [7]-es sorban 0-val osztok. Ez olyannyira „terminating”, hogy már a parancssor ellenőrzése során kiszúrja ezt a hibát, és már az „Eleje” sem fut le.

Megjegyzés:

A PowerShell 3.0-tól kezdve a 0-val való osztás nem megszakító hiba már:

PS C:\> "Eleje"; 15/0; "Vége"

Eleje

Attempted to divide by zero.

At line:1 char:10

+ "Eleje"; 15/0; "Vége"

+          ~~~~

    + CategoryInfo          : NotSpecified: (:) [], RuntimeException

    + FullyQualifiedErrorId : RuntimeException

 

Vége

A throw kulcsszóval mindenképpen megszakító hibát generálunk:

[8] PS C:\old> "Eleje"; throw "kakukk"; "Vége"

Eleje

kakukk

At line:1 char:15

+ "Eleje"; throw <<<<  "kakukk"; "Vége"

    + CategoryInfo          : OperationStopped: (kakukk:String) [], RuntimeEx

   ception

    + FullyQualifiedErrorId : kakukk

A [8]-as sorban én magam okoztam egy megszakító hibát a throw kulcsszó segítségével.

Most nézzünk nem megszakító hibára példát:

[9] PS C:\old> "Eleje"; Remove-Item c:\old\nincs.txt; "Vége"

Eleje

Remove-Item : Cannot find path 'C:\old\nincs.txt' because it does not exist.

At line:1 char:21

+ "Eleje"; Remove-Item <<<<  c:\old\nincs.txt; "Vége"

    + CategoryInfo          : ObjectNotFound: (C:\old\nincs.txt:String) [Remo

   ve-Item], ItemNotFoundException

    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.Remo

   veItemCommand

 

Vége

A fenti példában nem megszakító hiba történt, amikor törölni akartam egy nem létező fájlt, ugyan hibát kaptam, de kiírásra került a „Vége” is.

Mi magunk is befolyásolhatjuk a hibák lefolyását. Akár parancsonként vagy akár az adott konzolra vonatkozóan is. Először nézzük, hogy a cmdletek esetében mit tehetünk. A parancsokhoz tartozó súgókban legtöbbször valami hasonlót látunk:

[18] PS C:\old> (get-help remove-item).syntax

 

Remove-Item [-path] <string[]> [-recurse] [-force] [-include <string[]>] [-

exclude <string[]>] [-filter <string>] [-credential <PSCredential>] [-whatI

f] [-confirm] [<CommonParameters>]

Remove-Item [-literalPath] <string[]> [-recurse] [-force] [-include <string

[]>] [-exclude <string[]>] [-filter <string>] [-credential <PSCredential>]

[-whatIf] [-confirm] [<CommonParameters>]

Nézzük meg, a „CommonParameters ” mi lehet?

Paraméter 

Magyarázat

Verbose

Bőbeszédes kimenetet ad a művelet lefolyásáról.

Debug 

Hibakereső információkat ad, és interaktív módon lekezelhetők a hibák.

ErrorAction

Az  előzőhöz hasonló, de nem csak interaktívan, hanem fixen beállítható hibakezelési mód:

Continue [default] - folytat,

Stop - megáll,

SilentlyContinue – figyelmeztetés nélkül továbbmegy,

Inquire - rákérdez.

ErrorVariable 

Saját hibaváltozónk neve ($ jel nélkül!). Az $error változó mellett ide is betöltődik a hibát leíró objektum.

OutVariable

Kimenetet ide tölti be.

OutBuffer 

Az objektum-puffer mérete, ennyi elemet „magában” tart, mielőtt továbbítja az outputot a következő csőszakasznak.

WarningAction

Hasonló, mint az ErrorAction, csak épp a figyelmeztetések bekövetkezését kezeli.

WarningVariable

Figyelmeztetések betöltése alternatív változóba.

A -debug paraméter pont a mostani témánkba vág, nézzük, milyen opciókat kínál:

[23] PS C:\old> "Eleje"; get-content blabla.txt -debug; "Vége"

Eleje

 

Confirm

Cannot find path 'C:\old\blabla.txt' because it does not exist.

[Y] Yes  [A] Yes to All  [H] Halt Command  [S] Suspend  [?] Help

(default is "Y"):h

Get-Content : Command execution stopped because the user selected the Halt opt

ion.

At line:1 char:21

+ "Eleje"; get-content <<<<  blabla.txt -debug; "Vége"

    + CategoryInfo          : OperationStopped: (:) [Get-Content], ParentCont

   ainsErrorRecordException

    + FullyQualifiedErrorId : ActionPreferenceStop,Microsoft.PowerShell.Comma

   nds.GetContentCommand

Láthatjuk, hogy ezzel a paraméterrel a nem megszakító hibák lefolyásáról dönthetünk interaktív módon. Ha a „Halt” opciót választom, akkor kiírta a megállás okát, és a „Vége” nem futott le. Nézzünk, hogy hogyan viselkedik más válasz esetén:

[24] PS C:\old> "Eleje"; get-content blabla.txt -debug; "Vége"

Eleje

 

Confirm

Cannot find path 'C:\old\blabla.txt' because it does not exist.

[Y] Yes  [A] Yes to All  [H] Halt Command  [S] Suspend  [?] Help

(default is "Y"):a

Get-Content : Cannot find path 'C:\blabla.txt' because it does not exist.

At line:1 char:21

+ "Eleje"; get-content <<<<  blabla.txt -debug; "Vége"

    + CategoryInfo          : ObjectNotFound: (C:\blabla.txt:String) [Get-Con

   tent], ItemNotFoundException

    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetC

   ontentCommand

 

Vége

Ha „Yes” vagy „Yes to All” opciót választom, akkor a cmdlet úgy fut le, ahogy eddig láttuk a nem megszakító hibáknál, azaz kiírta a hibát, de tovább futott. Nézzük a további választási lehetőségünket:

[25] PS C:\old> "Eleje"; get-content blabla.txt -debug; "Vége"

Eleje

 

Confirm

Cannot find path 'C:\old\blabla.txt' because it does not exist.

[Y] Yes  [A] Yes to All  [H] Halt Command  [S] Suspend  [?] Help

(default is "Y"):s

[26] PS C:\old >>> 1+1

2

[27] PS C:\old>>> exit

 

Confirm

Cannot find path 'C:\Users\tibi\blabla.txt' because it does not exist.

[Y] Yes  [A] Yes to All  [H] Halt Command  [S] Suspend  [?] Help

(default is "Y"):h

Ha a „Suspend” opciót választjuk, akkor a szkript futása megszakad, egy alprompt nyílik és ott bármit begépelhetünk, ellenőrizhetünk, majd az exit kulcsszót beírva visszatérhetünk a fenti állapothoz, azaz újra rákérdez, hogy mi legyen.

Nézzük a másik témánkba vágó „CommonParameter”-t, az –ErrorAction-t:

[44] PS C:\old> "Eleje"; get-content blabla.txt -ErrorAction Stop; "Vége"

Eleje

Get-Content : Cannot find path 'C:\blabla.txt' because it does not exist.

At line:1 char:21

+ "Eleje"; get-content <<<<  blabla.txt -ErrorAction Stop; "Vége"

    + CategoryInfo          : ObjectNotFound: (C:\blabla.txt:String) [Get-Con

   tent], ItemNotFoundException

    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetC

   ontentCommand

Ha a Stop opciót választjuk, akkor a szkript a nem megszakító hibáknál is megszakítódik.

[45] PS C:\old> "Eleje"; get-content blabla.txt -ErrorAction SilentlyContinu

e; "Vége"

Eleje

Vége

A SilentlyContinue opcióval folytatja a szkriptet és nem is ad semmilyen hibajelzést.

[46] PS C:\old> "Eleje"; get-content blabla.txt -ErrorAction Inquire; "Vége"

 

Eleje

 

Confirm

Cannot find path 'C:\old\blabla.txt' because it does not exist.

[Y] Yes  [A] Yes to All  [H] Halt Command  [S] Suspend  [?] Help

(default is "Y"):a

Get-Content : Cannot find path 'C:\blabla.txt' because it does not exist.

At line:1 char:21

+ "Eleje"; get-content <<<<  blabla.txt -ErrorAction Inquire; "Vége"

    + CategoryInfo          : ObjectNotFound: (C:\blabla.txt:String) [Get-Con

   tent], ItemNotFoundException

    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetC

   ontentCommand

 

Vége

Ha az Inquire opciót választjuk, akkor - hasonlóan a –debug paraméter használatakor látottakhoz - rákérdez a folytatás mikéntjére.



Word To HTML Converter