web-dev-qa-db-fra.com

Identification du type d'exception dans un gestionnaire

J'ai créé une classe d'exception personnalisée

public class Web2PDFException : Exception
{
    public Web2PDFException(string message,
       Exception innerException)
        : base(message, innerException)
    {
    }
}

Dans mon application, je veux savoir si l'exception de levée est mon exception personnalisée ou non.

try
{
}
catch (Exception err)
{
//Find exception type here
}
34
Tomas

MISE À JOUR: en supposant C # 6 , les chances sont que votre cas puisse être exprimé comme un filtre d'exception. Il s'agit de l'approche idéale du point de vue des performances, en supposant que votre besoin peut être exprimé en termes de celui-ci, par exemple:

try
{
}
catch ( Web2PDFException ex ) when ( ex.Code == 52 )
{
}

En supposant que C # <6, le plus efficace consiste à intercepter un type Exception spécifique et à effectuer la gestion en fonction de cela. Toute manipulation fourre-tout peut être effectuée séparément

try
{
}
catch ( Web2PDFException ex )
{
}

ou

try
{
}
catch ( Web2PDFException ex )
{
}
catch ( Exception ex )
{
}

ou (si vous devez écrire un gestionnaire général - ce qui est généralement une mauvaise idée, mais si vous êtes sûr que cela vous convient le mieux, vous êtes sûr):

 if( err is Web2PDFException)
 {
 }

ou (dans certains cas, si vous devez faire des trucs de hiérarchie de types plus complexes qui ne peuvent pas être exprimés avec is)

 if( err.GetType().IsAssignableFrom(typeof(Web2PDFException)))
 {
 }

ou basculez vers VB.NET ou F # et utilisez is ou Type.IsAssignableFrom dans les filtres d'exception

43
Ruben Bartelink

Lorsque je fais face à des situations où je ne sais pas exactement quel type d'exception peut sortir d'une méthode, une petite "astuce" que j'aime faire est de récupérer le nom de classe de l'exception et de l'ajouter au journal des erreurs pour plus d'informations .

try
{
   <code>

} catch ( Exception caughtEx )
{
   throw new Exception("Unknown Exception Thrown: "
                       + "\n  Type:    " + caughtEx.GetType().Name
                       + "\n  Message: " + caughtEx.Message);
}

Je me porte garant de toujours gérer les types d'exceptions individuellement, mais le supplément d'informations peut être utile, en particulier lorsqu'il s'agit de code de personnes qui aiment capturer des types génériques fourre-tout.

59
Oskuro
try
{
    // Some code
}
catch (Web2PDFException ex)
{
    // It's your special exception
}
catch (Exception ex)
{
    // Any other exception here
}
16
batwad

Au lieu d'arrêter une session de débogage pour ajouter des instructions de débogage, puis de recompiler et de redémarrer, pourquoi ne pas simplement utiliser le débogueur pour répondre immédiatement à cette question en appelant GetType où le point d'arrêt a atteint?

Alors que le débogage permet d'appeler des méthodes, interrogez toutes les variables en utilisant le Immediate Window du débogueur. Voir VS Docs: Fenêtre immédiate


Par exemple, j'avais besoin de savoir quelle était l'exception et j'ai juste extrait la propriété Name de GetType en tant que telle sans avoir à recompiler:

enter image description here

16
ΩmegaMan
try
{
}
catch (Exception err)
{
    if (err is Web2PDFException)
        DoWhatever();
}

mais il y a probablement une meilleure façon de faire ce que vous voulez.

9
erikkallen

Vous devez toujours attraper des exceptions aussi concrètes que possible, vous devez donc utiliser

try
{
    //code
}
catch (Web2PDFException ex)
{
    //Handle the exception here
}

Vous devriez bien sûr utiliser quelque chose comme ça si vous insistez:

try
{
}
catch (Exception err)
{
    if (err is Web2PDFException)
    {
        //Code
    }
}
2
Maximilian Mayerl

vous pouvez ajouter des informations supplémentaires à votre exception dans votre classe, puis lorsque vous interceptez l'exception, vous pouvez contrôler vos informations personnalisées pour identifier votre exception

this.Data["mykey"]="keyvalue"; //you can add any type of data if you want 

et ensuite vous pouvez obtenir votre valeur

string mystr = (string) err.Data["mykey"];

comme ça pour plus d'informations: http://msdn.Microsoft.com/en-us/library/system.exception.data.aspx

2
fealin

Alternativement:

var exception = err as Web2PDFException; 

if ( excecption != null ) 
{ 
     Web2PDFException wex = exception; 
     .... 
}
1
Joe B