2010-04-23 5 views
1

Pourquoi mon bloc try-catch génère-t-il toujours une erreur lorsqu'il est géré?Pourquoi une erreur se produirait-elle dans mon try-catch?

Détails de l'exception: System.NullReferenceException: objet référence non définie à une instance d'un objet .

   Try 
    Here >> : _MemoryStream.Seek(6 * StartOffset, 0) 
       _MemoryStream.Read(_Buffer, 0, 6) 
       Catch ex As IOException 
       // Handle Error 
       End Try 

Edit: Nettoyé la question à supprimer les informations étrangères.

Répondre

6

l'application explose sur une ligne à l'intérieur d'un bloc try-catch. N'importe quelle idée pourquoi cela se produirait? Cela ne devrait-il pas échouer silencieusement?

Pourquoi pensez-vous qu'une exception ne peut pas se produire dans un essai/catch? Tout le but du bloc try.catch est de définir comment vous comptez gérer les situations exceptionnelles. S'il n'y a pas de bloc catch correspondant au type d'exception levée, l'exception se propagera jusqu'à ce que du code l'attrape ou jusqu'à ce qu'il soit levé comme non traité.

Il est bien sûr possible d'utiliser Catch ex as Exception comme un bloc pour capturer toutes les exceptions et les avaler, mais c'est rarement une bonne idée.

Tant que NullReferenceException va, vous ne voulez presque jamais les attraper et les manipuler (presque jamais). Ils sont généralement une indication qu'il existe un bug quelque part dans le code où la logique ne teste pas une référence pour null avant d'accéder à des méthodes ou propriétés. En fait, il est probable que la variable _MemoryStream soit elle-même le coupable - si elle est nulle, l'invocation d'un appel déclencherait cette exception.

6

Étant donné que le bloc try/catch n'attrape qu'un IOException, il n'attrapera pas NullReferenceException.

Cela indique probablement une sorte d'erreur logique dans le programme au-delà du code que vous avez affiché. Et pour l'anecdote, avec ce genre d'exception, le programme ne devrait pas échouer en silence - c'est probablement un bug dans le code ou dans la façon dont la bibliothèque est utilisée (bien que cela aurait probablement dû être géré par la bibliothèque), pas un problème avec l'environnement d'exécution. Parce que l'exception soulevée n'est pas IOException.

0

Vous avez besoin d'une capture toutes les exceptions.

0

Il n'y a rien à dire que la capture est attraper toutes les exceptions; il pourrait être limité à une certaine catégorie d'exception qui ne couvre pas celle-ci. Même s'il attrape cette classe d'exception, il peut la rejouer. Lorsque cela est fait correctement (c'est-à-dire lancer;), relancer montrera l'exception comme étant lancée sur la ligne à l'intérieur de la capture qui a causé l'exception en premier lieu.

1
  1. Les essais ne présentent généralement pas de défaillance silencieuse. Juste pour éclaircir ça.

  2. Est-ce que _MemoryStream est nul (ou Nothing) à ce stade du code? try-catch devrait pratiquement jamais être utilisé pour gérer un NullReferenceException.
    dans ce cas, il ne prend pas NullReferenceException car un NullReferenceException n'est pas un IOException.

1

Cela se produit parce que vous n'attrapant exceptions de type System.IOException, et l'exception levée est un System.NullReferenceException. Pour l'attraper, vous aurez besoin de le faire:

Try 
    _MemoryStream.Seek(6 * StartOffset, 0) 
    _MemoryStream.Read(_Buffer, 0, 6) 
Catch ex As IOException 

Catch ex As NullReferenceException 
    ' Exception would be caught and handled here. 
End Try 
1

Je ne suis pas expert en vb.net, mais une exception de référence null n'est pas un IOException, donc l'exception tombe à travers et ne doit pas être pris à un plus haut niveau. Si vous attrapez l'exception IOException comme exception, cela devrait faire l'affaire, mais ce n'est pas une bonne pratique.

+0

Non seulement ce n'est pas une bonne pratique, mais c'est presque toujours un bug. –

0

La capture intercepte une exception d'E/S (uniquement). L'exception en cours est une exception NullReferenceException.

+0

Wow. 7 autres réponses dans le temps qu'il m'a fallu pour taper ma réponse. :) –

Questions connexes