114 votes

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

J'ai un morceau de code try catch :

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é de telle sorte que la base de données vérifie les doublons et renvoie une erreur s'il y a des doublons. Actuellement, comme vous pouvez le voir, j'ajoute la même erreur au modèle quelle que soit l'erreur survenue. Je souhaite que cette erreur ne soit ajoutée au modèle que si elle a été causée par l'erreur de duplication définie par l'administrateur de base de données.

Voici l'erreur que je souhaite détecter. Notez qu'elle se trouve dans l'exception interne. Quelqu'un peut-il me dire comment attraper spécifiquement cette erreur ?

enter image description here

187voto

Davide Piras Points 28708

avant votre prise actuelle, ajoutez ce qui suit :

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

En C# 6, vous pouvez faire ce qui suit :

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

22voto

Nishantha Points 399

Remplacer System.Threading.ThreadAbortException avec 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
    }
}

12voto

Jason Points 129

Je n'ai pas assez de recul pour faire un commentaire. En réponse à la question de @conterio (dans la réponse de @Davide Piras) :

Existe-t-il une syntaxe "quand pas" ?

C'est le cas.

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

10voto

Uday Desiraju Points 75

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
       }
   }

-3voto

Ann B. G. Points 304

Vous pouvez jeter un coup d'œil à la classe SQLException -- et vérifier le contenu du message d'exception s'il contient ce que vous voyez maintenant dans votre exception interne Quelque chose comme ça :

try
{
    //your code here
}
catch (SQLException ex)
{
    if (ex.Message.Contains("Cannot insert duplicate key in obj...."))
    {
        //your code here
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X