2010-01-21 4 views
0

Quelqu'un pourrait-il me dire pourquoi un problème dans le modèle de nom ne serait pas attrapé par ce try catch?Asp.net MVC exception ne pas être attrapé dans try catch block

J'ai essayé ceci sur deux différentes méthodes de contrôleur maintenant, et les deux fois, même si le linq2sql ne permet pas aux données d'être sauvées, le code ne saute jamais dans le bloc catch.

J'ai regardé l'objet nom au milieu de la trace, et la propriété isvalid est false, mais l'attribut modelstate isvalid est true. De toute façon, le code ne saute jamais dans le bloc catch.

Je tire mes cheveux à ce sujet. J'ai l'impression que ce sera vraiment stupide.

Le code fonctionne tous de la même manière que le dîner nerd.

NounRepository nounRepository = new NounRepository(); 
     Noun noun = new Noun(); 
     try 
     {     
      UpdateModel(noun); 
      nounRepository.Add(noun); 
      nounRepository.save(); 
     } 
     catch (Exception ex) 
     { 
      ModelState.AddRuleViolations(noun.GetRuleViolations()); 
      return View(noun); 
     } 
    return View(noun); 

Mise à jour

Je viens d'ajouter ce code, et maintenant les règles reviennent à la fine extrémité avant, il semble donc juste que la prise d'essai est pas attraper! Je préférerais ne pas avoir à ajouter du code de cette manière, car cela semble être une duplication inutile.

Répondre

1

Vous avez fait face à des changements logiques dans mvc - validation ici ne pas jeter des exceptions. En effet, vous devez le vérifier en utilisant if.

Je doute que l'exception se produise - vous devez attraper l'exception linq2sql de toute façon, le code est correct. Il y a aussi une grande chance que dans 'save' ou 'add' vous ayez un autre attrapé - c'est une erreur assez commune

+0

Merci pour la réponse, le problème était une autre tentative d'essai que j'avais utilisée plus tôt dans le projet, avant que j'ai eu cette validation. La leçon très importante apprise au sujet d'essayer attraper, merci! –

0

Faites-vous quelque chose dans un autre thread? C'est souvent une cause d'exceptions qui ne sont pas prises.

+0

Non, rien ne se passe. C'est vraiment bizarre, je peux poster plus de code si ça peut aider, mais je n'arrive pas à comprendre pourquoi quand nounRepository.save() est appelé, il ne sort pas d'erreur. Je regarde le code passer à travers tout le code de validation, puis il arrive juste à la fin du bloc try. –

1

La règle de programmation n ° 1: catch n'est pas cassée (AKA: SELECT n'est pas cassé). Si vous avez vraiment des doutes, ouvrez le menu Déboguer, choisissez "Exceptions", puis cochez la case "Expressions d'exécution Common Language" sous "Thrown". Cela provoquera le débogueur à rompre sur toutes les exceptions de première chance. Si le débogueur ne se casse pas pendant votre mise à jour, l'exception n'est jamais levée en premier lieu. N'oubliez pas de décocher lorsque vous avez terminé, car le comportement devient assez ennuyeux dans des conditions normales d'utilisation.

P.S. Ne jamais attraper System.Exception. Attrape le (s) type (s) spécifique (s) d'exception dont vous savez qu'il pourrait être réellement lancé.

+0

Dans chaque règle, il existe une exception. Par exemple, n'est finalement pas exécuté pour l'exception ThreadAbort :) Et attraper peut-être trop ... ne me souviens pas exactement – st78

+0

Merci pour votre réponse, allumer la gestion des exceptions aurait résolu ce problème beaucoup plus rapidement pour moi.Une très bonne chose à savoir pour le futur. Merci! –

+0

@Sergey: C'est exactement pourquoi vous ne devriez pas essayer d'attraper 'System.Exception'. Il ne fera probablement pas ce que vous voulez sur une exception OutOfMemoryException. ;) – Aaronaught