Nardo26
Messages postés37Date d'inscriptionsamedi 13 janvier 2018StatutMembreDernière intervention 1 mars 2021
-
Modifié le 24 mai 2019 à 12:08
Whismeril
Messages postés18417Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 5 juin 2023
-
24 mai 2019 à 16:18
Bonjour,
Décidemment, il ne m'arrive que des trucs bizarres qui fonctionnent bien chez les autres mais pas chez moi. ^^
Je récupère des données sauvegardées dans un fichier xml que je stocke dans des variables.
Le programme fonctionne, je récupère bien mes données mais j'ai systématiquement une levée d'exception au moment de l'instanciation du XmlSerializer et ceci AVANT même que je fasse un accès à mon fichier. Cette exception ne me déroute pas dans le catch et le programme continu "normalement" son job...
Même si ce n'est pas bloquant, j'aimerai bien corriger ce problème qui apparait dans ma fenêtre Sortie à chaque fois que je lance le programme. (Ne me dites pas de fermer la fenêtre avant de lancer ^^ )
Private Function LoadConfiguration() As Boolean
Dim serialXML As Xml.Serialization.XmlSerializer
Dim Reader As StreamReader
Try
' C'est cette ligne qui déclenche l'exception :
' System.IO.FileNotFoundException dans mscorlib.dll
serialXML = New Xml.Serialization.XmlSerializer(GetType(AppConfiguration))
Reader = New StreamReader(Path.Combine(appData, "Config.xml"))
Me.Config = CType(serialXML.Deserialize(Reader), AppConfiguration)
Reader.Close()
Catch ex As Exception
LogTrace.WriteLine("#" + GetCurrentMethod().Name + " : " + ex.Message)
Return False
End Try
Reader = Nothing
serialXML = Nothing
TxbCfgPosXChargement.Text = Config.PlateauChargement.ToString
TxbCfgPosXEchantillon.Text = Config.PlateauEchantillon.ToString
' . . .
End Sub
Ma classe AppConfiguration est définie comme ceci :
<Serializable>
Public Class AppConfiguration
''' <summary>Coordonnée en X du plateau en position de chargement. L'unité est en mm.</summary>
Public PlateauChargement As Double
''' <summary>Coordonnée en X du plateau pour prendre l'échantillon. L'unité est en mm.</summary>
Public PlateauEchantillon As Double
''' <summary>Coordonnée en Z du plateau pour faire tremper le tampon dans l'échantillon. L'unité est en mm.</summary>
Public AltitudeEchantillon As Double
''' <summary>Coordonnée en X du plateau pour prendre le tampon. L'unité est en mm.</summary>
Public PlateauTampon As Double
' . . . .
End Class
J'ai vérifié ce que renvoi le GetType. Tout me parait correct.
Dans les options avancées de compilation, "Générer des assemblys de sérialisation", J'ai essayé toutes les cas...
Merci d'avance à ceux qui voudront bien se pencher sur ce sujet. :)
Whismeril
Messages postés18417Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 5 juin 2023624 24 mai 2019 à 16:05
Haaa, c'est la dll qui plante, pas ton programme.
Pas de soucis, elle a sa gestion d'erreur, qui effectivement t'affiche un file not found dans la sortie, mais elle continue et fais son job. Donc sa gestion d'erreur est bien faite ;)
Nardo26
Messages postés37Date d'inscriptionsamedi 13 janvier 2018StatutMembreDernière intervention 1 mars 2021 24 mai 2019 à 16:09
Ouf ! Ca me rassure, donc pour ce genre d'erreur, il faut fermer les yeux ?
Dans un sens cela m'arrange de ne pas partir dans le catch. :p
Whismeril
Messages postés18417Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 5 juin 2023624 24 mai 2019 à 16:18
Elle fait exactement la même chose que toi, elle affiche dans la console un truc qui ne va pas.
De là à savoir quoi...
Ça peut être n'importe quoi, par exemple, une dll C++ native peut-être appelée, en général ces dll ont de multiples dépendances, dont certaines ne servent que dans un cas très précis, qui n'est pas le tiens, donc pour toi si la dépendance n'est pas là ça ne change rien, mais la dll remonte quand même qu'elle n'a pas trouvé cette dépendance.
Ça n'entrave pas la bonne marche de ton programme alors on fait avec.
Whismeril
Messages postés18417Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 5 juin 2023624 24 mai 2019 à 13:29
Bonjour,
y'a bien longtemps que je n'ai pas utilisé XmlSerializer (je préfère Linq), mais il me semble bien que dans la classe il faut décrire quelle propriété est un élément, un attribut, pas sérialisé etc...
Nardo26
Messages postés37Date d'inscriptionsamedi 13 janvier 2018StatutMembreDernière intervention 1 mars 2021 24 mai 2019 à 14:51
J'ai le même phénomène avec d'autres classes. (j'ai 3 classes pour lesquelles j'applique le même code)
Le pire c'est que ce code fonctionne !
Mais je me dis que ces exceptions ne viennent pas là par hasard et je n'aime pas laisser trainer des messages d'erreurs de ce genre.
Un programme qui "marchouille" plantera dans 3 mois à la prochaine mise à jour...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Nardo26
Messages postés37Date d'inscriptionsamedi 13 janvier 2018StatutMembreDernière intervention 1 mars 2021 24 mai 2019 à 15:53
J'ai commencé à regarder vers LINQ que je ne connais absolument pas....
Je ne peux pas trop me baser sur le lien que tu as mis, sauf si je déclare un constructeur dans ma classe.
Donc pour l'instant j'en suis là…
Private Function DeserialConfig() As AppConfiguration
Dim xEle As XElement = XElement.Load(Path.Combine(appData, "Config.xml"))
Dim Params As IEnumerable(Of XElement) = xEle.Elements
Dim result As New AppConfiguration
For Each Param As XElement In Params
Debug.WriteLine(Param.Name.ToString + " = " + Param.Value)
Select Case Param.Name.ToString
Case "PlateauChargement"
' Affectation de la variable en tenant compte de son type et de la culture (caractère décimal)
Case "..."
End Select
Next
return result
End Function
Dans ma boucle for à part faire un gros select case avec le nom des paramètres, je ne vois pas pour l'instant comment remplir mon objet result.
il va me rester à traiter les tableaux également : dans ma classe j'ai un tableau de 4 doubles et je ne vois pas pour l'instant la manière dont il faut traiter ce cas.
Bref, cela m'a l'air un peu lourd comme procédé… il doit certainement y avoir un autre moyen de faire. :p
Whismeril
Messages postés18417Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention 5 juin 2023624 Modifié le 24 mai 2019 à 15:54
Ce que je ne comprends pas c'est que tu dis que ça marche, ce qui voudrait dire que l'erreur n'apparait pas à la ligne que tu penses
Regarde
Try
dim toto as int32 = 1 / 0'oh erreur on va direct dans le catch
dint tutu as string = "Ce code n'est pas exécuté s'il y a une erreur avant"
Catch ex As Exception
LogTrace.WriteLine("#" + GetCurrentMethod().Name + " : " + ex.Message)
Return False
End Try
As tu mis un point d'arrêt et exécuté en pas à pas pour voir?
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Nardo26
Messages postés37Date d'inscriptionsamedi 13 janvier 2018StatutMembreDernière intervention 1 mars 2021 24 mai 2019 à 15:56
Oui je suis d'accord avec toi.
C'est cela que je ne comprend pas. Quand je suis en pas à pas, je vois apparaitre le message d'exception mais mon code continu a se dérouler comme si cette exception était ignorée. Je ne part pas dans le catch
Nardo26
Messages postés37Date d'inscriptionsamedi 13 janvier 2018StatutMembreDernière intervention 1 mars 2021 24 mai 2019 à 15:56
Le message apparait uniquement dans la fenetre de sortie
Nardo26
Messages postés37Date d'inscriptionsamedi 13 janvier 2018StatutMembreDernière intervention 1 mars 2021 Modifié le 24 mai 2019 à 16:01
J'appuis sur F10, et pas de catch...
Nardo26
Messages postés37Date d'inscriptionsamedi 13 janvier 2018StatutMembreDernière intervention 1 mars 2021 24 mai 2019 à 16:18
24 mai 2019 à 16:09
Dans un sens cela m'arrange de ne pas partir dans le catch. :p
24 mai 2019 à 16:18
De là à savoir quoi...
Ça peut être n'importe quoi, par exemple, une dll C++ native peut-être appelée, en général ces dll ont de multiples dépendances, dont certaines ne servent que dans un cas très précis, qui n'est pas le tiens, donc pour toi si la dépendance n'est pas là ça ne change rien, mais la dll remonte quand même qu'elle n'a pas trouvé cette dépendance.
Ça n'entrave pas la bonne marche de ton programme alors on fait avec.