Question try/catch

Plus d'informations
il y a 15 ans 3 mois #8925 par jojo
Réponse de jojo sur le sujet Re:try/catch
Hello :laugh:

@Matthew, merci pour ton aide, c'est dommage que set-location ne gère que les exception générique

@Laurent, merci

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 3 mois #8928 par Matthew BETTON
Réponse de Matthew BETTON sur le sujet Re:try/catch
Laurent Dardenne écrit:

Matthew BETTON écrit:

J'ai bien l'impression que la Cmdlet Set-Location ne renvoie qu'une erreur \"générique\"....

PS gére des erreurs bloquante et non-bloquante.
Une exception stoppe le traitement, c'est donc une erreur bloquante, et un Write-Error est non-bloquant.
Le souci est que le try/catch ne gére que les exceptions :/<br><br>Message édité par: Laurent Dardenne, à: 16/02/11 14:08


Merci pour cet éclaircissement :)

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 3 mois #8929 par Arnaud Petitjean
Réponse de Arnaud Petitjean sur le sujet Re:try/catch
Je me suis plusieurs fois également heurté à ce problème.

Pour ma part je pense qu'il s'agit plutôt d'un bug (et non pas d'une fonctionnalité).

Quoi qu'il en soit, il est préférable de toujours positionner la variable $erroractionpreference à 'stop' lorsque l'on \"joue\" avec try/catch. Cela permet de transformer une erreur non blocante en erreur blocante.

Un peut comme ceci :

[code:1]
&{
$erroractionpreference='stop'

try{
Set-Location C:\dummy
}
catch [System.Management.Automation.ItemNotFoundException] {
Write-Host \"Directory not found !\"
}
catch [System.Management.Automation.DriveNotFoundException] {
Write-Host \"Drive not found !\"
}
catch{
Write-Host \"Other error : $($error[0].exception.gettype())\"
}
}
[/code:1]

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 3 mois #8931 par Arnaud Petitjean
Réponse de Arnaud Petitjean sur le sujet Re:try/catch
Voici une façon de contourner le problème, pas terrible je sais mais bon...

[code:1]
&{
$erroractionpreference='stop'
try{
Set-Location C:\dummy
}

catch [System.Management.Automation.ActionPreferenceStopException]{
Write-Host \"it's a ActionPreferenceStopException error!\"
switch( $_.Exception.gettype().name)
{
'ItemNotFoundException' {\"Directory not found !\"; break}
'DriveNotFoundException' {\"Drive not found !\"; break}
default {\"Other error : $($error[0].exception.gettype())\"}
}
}
}[/code:1]

En fait, ce problème arrive lorsque l'on tente d'intercepter des erreurs non blocantes.

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 3 mois #8933 par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:try/catch
Pas terrible, pas terrible... Faut pas être modeste ! :)

On peut très facilement généraliser ton code pour faire un petit script qui peut s'avérer très pratique :

[code:1]
# catch-exception.ps1

param ([ScriptBlock]$Command, [Switch]$Customize)

$erroractionpreference = 'stop'

try
{
& $command
}

catch
{
if ($Customize)
{
$err = $_
switch ($err.Exception.GetType().Name)
{
\"ProcessCommandException\"
{ \"erreur process\" }

\"ItemNotFoundException\"
{ \"erreur objet introuvable\" }

default
{ $err.GetType() }
}
}
else
{
$_.Exception.GetType()
}
}
[/code:1]

On passe un bloc de script à catch-exception, celui-ci l'exécute et retourne le type de l'erreur rencontrée (s'il y a plusieurs erreurs, seule la première est retournée). On peut alors récupérer son nom (propriété Name) pour l'exploiter dans des sections Catch {} personnalisées.

En reprenant ton principe d'un bloc Switch servant à balayer les types d'exception qu'on veut traiter, le même script catch-exception peut être enrichi avec des traitements spécifiques à certains types d'exception. Le code ci-dessus reprend ton exemple pour deux types parmi les plus courants.

Pour exécuter ces traitements, on passe le paramètre -customize à catch-exception. Si le type d'exception n'est pas traité par le script, on aboutit quand même à son affichage.

[code:1]
PS> catch-exception {dir c:\dummy}

IsPublic IsSerial Name BaseType

----
True True ItemNotFoundException System.Management.Automation.SessionStateException


PS> catch-exception {dir c:\dummy} -customize
erreur objet introuvable

PS> catch-exception {gps dummy}

IsPublic IsSerial Name BaseType

----
True True ProcessCommandException System.SystemException


PS> catch-exception {gps dummy} -customize
erreur process

PS> catch-exception {dummycommand} -customize

IsPublic IsSerial Name BaseType

----
True True CommandNotFoundException System.Management.Automation.RuntimeException

[/code:1]

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 3 mois #8951 par jojo
Réponse de jojo sur le sujet Re:try/catch
Hello Arnaud et janel :laugh:

je vais voir vos codes de plus près...merci

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.043 secondes
Propulsé par Kunena