Question
try/catch
- jojo
-
Auteur du sujet
- Hors Ligne
- Membre elite
-
Réduire
Plus d'informations
- Messages : 187
- Remerciements reçus 0
il y a 15 ans 3 mois #8925
par jojo
Réponse de jojo sur le sujet Re:try/catch
Hello 
@Matthew, merci pour ton aide, c'est dommage que set-location ne gère que les exception générique
@Laurent, merci
@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.
- Matthew BETTON
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 968
- Remerciements reçus 0
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:
Merci pour cet éclaircissement
Matthew BETTON écrit:
PS gére des erreurs bloquante et non-bloquante.J'ai bien l'impression que la Cmdlet Set-Location ne renvoie qu'une erreur \"générique\"....
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.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 15 ans 3 mois #8929
par Arnaud Petitjean
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 ?
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
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.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 15 ans 3 mois #8931
par Arnaud Petitjean
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 ?
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
[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.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
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]
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.
- jojo
-
Auteur du sujet
- Hors Ligne
- Membre elite
-
Réduire
Plus d'informations
- Messages : 187
- Remerciements reçus 0
il y a 15 ans 3 mois #8951
par jojo
Réponse de jojo sur le sujet Re:try/catch
Hello Arnaud et janel 
je vais voir vos codes de plus près...merci
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
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- try/catch