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
}
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
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.
try
{
// Some code
}
catch (Web2PDFException ex)
{
// It's your special exception
}
catch (Exception ex)
{
// Any other exception here
}
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:
try
{
}
catch (Exception err)
{
if (err is Web2PDFException)
DoWhatever();
}
mais il y a probablement une meilleure façon de faire ce que vous voulez.
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
}
}
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
Alternativement:
var exception = err as Web2PDFException;
if ( excecption != null )
{
Web2PDFException wex = exception;
....
}