2015-09-12 1 views
0

Je suis la liste de toutes les applications USB dans l'application Winforms C# et en essayant d'utiliser la pédale pour jouer de l'audio.Comment gérer une exception non gérée de type 'System.ArgumentException'?

Je reçois l'erreur ci-dessous.

Une exception non gérée du type 'System.ArgumentException' se sont produits dans mscorlib.dll

Informations complémentaires: tableau de destination ne sont pas assez longtemps pour copier tous les éléments de la collection. Vérifiez l'index et la longueur du tableau.

private void ReadProcess(HidReport report) 
{ 
    byte[] message = report.Data; 
    uint _message; 
    Array.Reverse(message); 
    _message = BitConverter.ToUInt32(message, 0); // exception here! 
    .... 
+0

Mettez une grande flèche à l'instruction qui lève cette exception. Et poster la trace de la pile. –

+0

J'ai édité la question avec une erreur de lancement de ligne spécifique ainsi que le code complet .. S'il vous plaît aider. – vel2013

+1

Le message d'exception contient déjà les informations dont vous avez besoin. Le tampon n'est pas assez grand pour décoder un entier non signé de 32 bits. Un entier de 32 bits nécessite 4 octets, pour éviter ce problème, vérifiez si le tampon ('message') a une longueur d'au moins 4 octets. –

Répondre

1

BitConverter.ToUInt32(byte[] value, int startIndex) jette ArgumentException lorsque startIndex est supérieure ou égale à la longueur de la valeur moins 3, et est inférieure ou égale à la longueur de la valeur moins 1.

Le problème est dans report.Data parce qu'il ne répond pas aux exigences à convertir.

Vous pouvez toujours enrouler votre code dans try-catch-finally et gérer l'exception, mais je vous suggère de read more about different type of exceptions and how you should handle them.

1

Si vous voulez dire juste pour gérer exception spécifique, il suffit d'utiliser try/catch et dire explicitement quel type d'exception que vous voulez attraper:

try 
{ 
    byte[] message = report.Data; 
    uint _message; 
    Array.Reverse(message); 
    _message = BitConverter.ToUInt32(message, 0); 
} catch(ArgumentException ex) 
{ 
    // Your logic... 
} 

Puisque vous ne partageait pas exactement où l'exception se produit Je ne peux pas déterminer ce qu'il faut vérifier, mais vous devriez essayer de valider les paramètres si possible et soit jeter votre propre exception ou retourner une erreur spécifique.