web-dev-qa-db-fra.com

Comment déterminer si une exception est d'un type particulier

J'ai un code d'essai:

try 
{
    ...
}
catch(Exception ex) 
{
    ModelState.AddModelError(
        "duplicateInvoiceNumberOrganisation", "The combination of organisation and invoice number must be unique");
}

Pour ce morceau de code, j'essaie d'insérer un enregistrement dans une base de données: le dba l'a configuré pour que la base de données vérifie les doublons et renvoie une erreur s'il y en a. Actuellement, comme vous pouvez le constater, j'ajoute la même erreur au modèle, peu importe l'erreur survenue. Je veux que cela change afin que cette erreur ne soit ajoutée au modèle que si elle a été causée par l'erreur de duplication configurée par le dba.

Ci-dessous est l'erreur que je veux attraper. Notez que c'est dans l'exception interne. Quelqu'un peut-il me dire comment attraper spécifiquement celui-ci?

enter image description here

54
AnonyMouse

avant votre prise actuelle ajoute ce qui suit:

catch(DbUpdateException ex)
{
  if(ex.InnerException is UpdateException)
  {
    // do what you want with ex.InnerException...
  }
}

A partir de C # 6, vous pouvez effectuer les opérations suivantes:

catch(DbUpdateException ex) when (ex.InnerException is UpdateException)
{
    // do what you want with ex.InnerException...
}
103
Davide Piras

Remplacez System.Threading.ThreadAbortException par votre exception.

try
{
    //assume ThreadAbortException occurs here
}
catch (Exception ex)
{
    if (ex.GetType().IsAssignableFrom(typeof(System.Threading.ThreadAbortException)))
    {
         //what you want to do when ThreadAbortException occurs         
    }
    else
    {
         //do when other exceptions occur
    }
}
9
Nishantha

Pour obtenir le nom de l'exception, vous pouvez utiliser

    catch (Exception exc){
       if (exc.GetType().FullName == "Your_Exception") 
       {
          // The same can be user for InnerExceptions
          // exc.InnerException.GetType().FullName
       }
   }
1
Uday Desiraju

Pas assez de rep pour commenter. En réponse à la question @conterio (dans la réponse @Davide Piras):

y a-t-il une capture "quand ça ne l'est pas" syntaxe?

Il y a.

catch (Exception e) when (!(e is ArgumentException)) { }
0
Jason

tu veux dire 

catch (Exception e){
    if ( e.GetType() == XyzException) 
    //if (e.GetType().ToString() == "XyzException")
    //if (e.GetType().Name == .....)
}
0
T.Todua