Question catch Error[0] et EZLog module

Plus d'informations
il y a 1 mois 2 semaines #34181 par Arnaud Petitjean
Hello Gabriel,

Ok faisons comme ça. Nous attendons de tes nouvelles ;-).

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 1 mois 2 semaines - il y a 1 mois 2 semaines #34183 par Gabriel
Réponse de Gabriel sur le sujet catch Error[0] et EZLog module
et voici des nouvelles   j'ai reproduis sur les 2 ordi (et je penses que vous pouvez le faire aussi)

le message d'erreur apparait en fonction d'une erreur particuliere : quand il manque une accolade "{" ou "}"

voici le script qui met en place le journal et qui charge les fonctions (il y aura 2 fonctions avec 2 erreurs de typo differentes "(" et "{")

Script test.ps1
[CmdletBinding()]
param(
)

BEGIN{
    Import-Module ("{0}\_Modules\EZLog" -f $PSScriptRoot)

    $Tempus            = (get-date -f yyyyMMdd_HHmmss)
    $Journal        = "{0}\{1}_{2}.log"        -f $PSScriptRoot,$Tempus,((split-path -leaf $PSCommandPath) -replace ".ps1","" )

    $PSDefaultParameterValues = @{ 'Write-EZLog:LogFile' = $Journal ; 'Write-EZLog:Delimiter' = '|' }
    Write-EZLog -Header
    Write-EZLog -Category INF -Message ( "[^o^] > Greetings Programs!" ) -ToScreen
    Write-EZLog -Category INF -Message ( "Version EZlog: {0}" -f ((get-module ezlog) | select -ExpandProperty version) ) -ToScreen
    
}

PROCESS{

    try { . ("{0}\Test-FonctionAvecErreur1.ps1" -f $PSScriptRoot) }
    catch {
        # throw $Error[0]
        Write-EZLog -Category INF -Message ( "{0}" -f $Error[0] )
        Write-EZLog -Category INF -Message ( "Test-FonctionAvecErreur1.ps1 Error" )

    }

    try { . ("{0}\Test-FonctionAvecErreur2.ps1" -f $PSScriptRoot) }
    catch {
        # throw $Error[0]
        Write-EZLog -Category INF -Message ( "{0}" -f $Error[0] )
        Write-EZLog -Category INF -Message ( "Test-FonctionAvecErreur2.ps1 Error" )
    }

}
END{
    
    Write-EZLog -Category INF -Message ( "[^_^] > End of the Line.... ... .. ." ) -ToScreen
    Write-EZLog -Footer
}


Test-FonctionAvecErreur1.ps1  (erreur lié a une parenthese manquante)
function Test-FonctionAvecErreur1 {
    [CmdletBinding()]
    param(
        $prout = "toto"
    )
    if ($prout -match "toto"){
        write-host "Je le savais!"
        (
    }
    else {
        write-host "Zut!"
    }
}


Test-FonctionAvecErreur2.ps1  (erreur lié a une accolade manquante)
function Test-FonctionAvecErreur2 {
    [CmdletBinding()]
    param(
        $prout = "toto"
    )

    if ($prout -match "toto"){
        write-host "Je le savais!"
        }
    }
    else {
        write-host "Zut!"
    }
}


les logs resultantes on voit que la premiere passe et est loggé, la 2eme est ignoré (c'est carrement le block Catch qui est ignoré)
+----------------------------------------------------------------------------------------+
Script fullname          : D:\Workspace\Dev\ps_test-EZLogError\Test.ps1
When generated           : 2024-04-08 18:45:27
Current user             : ordi\gab
Current computer         : ordi
Operating System         : Microsoft Windows 10 Professionnel
OS Architecture          : 64 bits
+----------------------------------------------------------------------------------------+

2024-04-08 18:45:27| INF| [^o^] > Greetings Programs!
2024-04-08 18:45:27| INF| Version EZlog: 2.2.7
2024-04-08 18:45:27| INF| At D:\Workspace\Dev\ps_test-EZLogError\Test-FonctionAvecErreur1.ps1:9 char:4
+         (
+          ~
An expression was expected after '('.

At D:\Workspace\Dev\ps_test-EZLogError\Test-FonctionAvecErreur1.ps1:9 char:4
+         (
+          ~
Missing closing ')' in expression.
2024-04-08 18:45:27| INF| Test-FonctionAvecErreur1.ps1 Error
2024-04-08 18:45:27| INF| [^_^] > End of the Line.... ... .. .

+----------------------------------------------------------------------------------------+
End time                 : 2024-04-08 18:45:27
Total duration (seconds) : 1
Total duration (minutes) : 0.01
+----------------------------------------------------------------------------------------+


coté console:
PS D:\Workspace\Dev\ps_test-EZLogError> .\Test.ps1
2024-04-08 18:45:27| INF| [^o^] > Greetings Programs!

2024-04-08 18:45:27| INF| Version EZlog: 2.2.7

Write-EZLog: D:\Workspace\Dev\ps_test-EZLogError\Test.ps1:31
Line |
  31 |          Write-EZLog -Category INF -Message ( "{0}" -f $Error[0] )
     |          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Error formatting a string: Input string was not in a correct format. Failure to parse near offset 112.
     | Unexpected closing brace without a corresponding opening brace..
2024-04-08 18:45:27| INF| [^_^] > End of the Line.... ... .. .
Dernière édition: il y a 1 mois 2 semaines par Gabriel.

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

Plus d'informations
il y a 1 mois 1 semaine #34194 par Alastor
Réponse de Alastor sur le sujet catch Error[0] et EZLog module
Bonjour,

Quel résultat attendus tu ?

Car là; c'est powershell qui est à la ramasse ce qui est normal, et EzLog est hors de cause... mais powershell également...

J'ai fait le test avec le programme suivant, les deux autres fichiers ps1 étant inchangés.
[CmdletBinding()]
param(
)
BEGIN{
    write-host "begin"
   
}
PROCESS{
    write-host "process"
    try {
            write-host "try 1"
 . ("{0}\Test-FonctionAvecErreur1.ps1" -f $PSScriptRoot)
  }
    catch {
        write-host "catch 1"
        throw $Error
    }
    try {
        write-host "try 2"
         . ("{0}\Test-FonctionAvecErreur2.ps1" -f $PSScriptRoot)
          }
    catch {
        write-host "catch 2"
        throw $Error
    }
}
END{
    write-host "end"
}

Voila le résultat dans la console :
> .\test.ps1
begin
process
try 1
catch 1
Au caractère C:\Users\xxx\Downloads\test\Test-FonctionAvecErreur1.ps1:8 : 10
+         (
+          ~
Une expression est attendue après « ( ».
Au caractère C:\Users\xxx\Downloads\test\Test-FonctionAvecErreur1.ps1:8 : 10
+         (
+          ~
Parenthèse fermante « ) » manquante dans l’expression.
Au caractère C:\Users\xxx\Downloads\test\test.ps1:19 : 9
+         throw $Error
+         ~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (System.Collections.ArrayList:ArrayList) [], RuntimeException
    + FullyQualifiedErrorId : Au caractère C:\Users\xxx\Downloads\test\Test-FonctionAvecErreur1.ps1:8 : 10
+         (
+          ~
Une expression est attendue après « ( ».
Au caractère C:\Users\xxx\Downloads\test\Test-FonctionAvecErreur1.ps1:8 : 10
+         (
+          ~
Parenthèse fermante « ) » manquante dans l’expression.

C'est l'analyse syntaxique de powershell qui réagit, du coup, même les try/catch échouent, ce qui est normal.

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

Plus d'informations
il y a 1 mois 1 semaine - il y a 1 mois 1 semaine #34195 par Alastor
Réponse de Alastor sur le sujet catch Error[0] et EZLog module
Le seul moyen de faire ce que tu souhaites est de séparer les analyses syntaxiques, ce que tu dois pouvoir faire avec un "import-module" de tes ps1 contenant les fonctions.

Ce faisant et sauf erreur de ma part, l'analyse syntaxique aura lieu dans l'import, et tu auras une exception propre dans le ps1 principal dans lequel les try/catch feront alors leurs boulot.

Mais à ma connaissance, aucun programme, dans aucun langage, ne peut gérer lui même les erreurs syntaxiques, c'est à dire ne peut fonctionner malgré des erreurs syntaxiques, avec des erreurs grammaticales éventuellement, mais pas syntaxique.
Dernière édition: il y a 1 mois 1 semaine par Alastor.

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

Plus d'informations
il y a 1 mois 5 jours #34210 par Gabriel
Réponse de Gabriel sur le sujet catch Error[0] et EZLog module
Bonjour Alastor

Quel résultat attendus tu ?

simplement la possibilité de logger l'erreur, une partie de mes scripts sont lancés soit en job soit via le task scheduler, et donc un retour visuel n'est pas disponible.

le pb de la parenthese lui passe, visiblement effectivement il y aun soucis de formatage.

par contre au bureau certains de mes collegues utilise un autre module (github.com/mithrandyr/SimplyLog/) qui lui log les erreur meme avec le { ou }

comme la dit Laurent c'est un bug et je vais donc creer un issue sur github. si c'est reparable Laurent le dira, sinon on le fermera.

merci de tes lumieres comme toujours.
 

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

Plus d'informations
il y a 1 mois 5 jours #34211 par Alastor
Réponse de Alastor sur le sujet catch Error[0] et EZLog module
Bonjour,

De mon point de vue, qui est peut-être faux car mon analyse provient de vieilles expériences avec d'autres langages, ce n'est pas un bug.

En fait, tu es tellement loin des bonnes pratiques de powershell, que tu parviens à masquer une erreur de syntaxe qui n'est pas vu au chargement du script, lors de l'analyse syntaxique, mais seulement lors de l'exécution.

Si tu faisais un import-module de tes fichiers de fonction, ou si tu exécutais tes scripts ps1 comme un vrai script appelé depuis ton ps1 "principal", powershell et Ezlog n'auraient aucun problème à gérer. Mais là, tu masques une erreur syntaxique.

Si ta fonction erronée était directement saisie dans le script, celui -ci ne démarrerait pas du tout à cause de l'erreur syntaxique.

Du coup question, tes collègues importent-ils leurs fonctions de la même manière que toi ?

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

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