Je regarde l'article C# - Objet de transfert de données sur les DTO sérialisables.
L'article comprend ce morceau de code :
public static string SerializeDTO(DTO dto) {
try {
XmlSerializer xmlSer = new XmlSerializer(dto.GetType());
StringWriter sWriter = new StringWriter();
xmlSer.Serialize(sWriter, dto);
return sWriter.ToString();
}
catch(Exception ex) {
throw ex;
}
}
Le reste de l'article semble sain et raisonnable (pour un noob), mais ce try-catch-throw lance une WtfException... N'est-ce pas exactement l'équivalent de ne pas gérer du tout les exceptions ?
Ergo :
public static string SerializeDTO(DTO dto) {
XmlSerializer xmlSer = new XmlSerializer(dto.GetType());
StringWriter sWriter = new StringWriter();
xmlSer.Serialize(sWriter, dto);
return sWriter.ToString();
}
Ou est-ce que je rate quelque chose de fondamental dans la gestion des erreurs en C# ? C'est à peu près la même chose qu'en Java (sauf les exceptions vérifiées), n'est-ce pas ? ... C'est-à-dire qu'ils ont tous deux raffiné le C++.
La question de Stack Overflow La différence entre relancer une capture sans paramètre et ne rien faire ? semble confirmer ma thèse selon laquelle le "try-catch-throw" est une erreur.
EDIT :
Juste pour résumer pour ceux qui trouveront ce fil à l'avenir...
NE PAS
try {
// Do stuff that might throw an exception
}
catch (Exception e) {
throw e; // This destroys the strack trace information!
}
Les informations de la trace de la pile peuvent être cruciales pour identifier la cause profonde du problème !
DO
try {
// Do stuff that might throw an exception
}
catch (SqlException e) {
// Log it
if (e.ErrorCode != NO_ROW_ERROR) { // filter out NoDataFound.
// Do special cleanup, like maybe closing the "dirty" database connection.
throw; // This preserves the stack trace
}
}
catch (IOException e) {
// Log it
throw;
}
catch (Exception e) {
// Log it
throw new DAOException("Excrement occurred", e); // wrapped & chained exceptions (just like java).
}
finally {
// Normal clean goes here (like closing open files).
}
Attrapez les exceptions les plus spécifiques avant les moins spécifiques (tout comme Java).
Références :
21 votes
Bon résumé ; points supplémentaires pour avoir inclus le bloc final.
0 votes
Je voudrais ajouter que vous pouvez utiliser le "throw ;" pour être encore plus utile en ajoutant les paramètres qui ont été envoyés à la méthode dans la collection e.Data avant l'instruction "throw ;".
0 votes
@MickTheWarMachineDesigner (et peintre à temps partiel). Hein ? Vous parlez de la gestion des exceptions de Microshite Suckwell (probablement à partir de 2005, pour ce que j'en sais). Je parlais de la gestion des exceptions en général. Et oui, j'ai appris des choses depuis que j'ai posté ceci il y a presque quatre ans..... Mais oui, j'avoue que vous avez un point valable, mais je pense que vous avez manqué le vrai point ; si vous voyez ce que je veux dire ? Cette question porte sur la gestion généralisée des exceptions en C#, et plus particulièrement sur le rejet des exceptions... de TOUTES sortes. C'est cool ?
2 votes
Veuillez envisager de déplacer la section du résumé de l'édition dans votre question vers sa propre réponse. Pour savoir pourquoi, voir Éditer une auto-réponse à partir d'une question et Réponse intégrée à la question .
0 votes
Il semble judicieux d'attraper et de lancer de nouvelles exceptions lors de l'encapsulation d'un module tiers, car cela supprime les dépendances de ce module dans l'ensemble de votre solution. Certains exemples dans "Adaptive Code via C#" expliquent bien cela, avec de bonnes justifications je crois. Votre premier exemple n'est pas un bon exemple de cela cependant.
5 votes
Personne n'a remarqué la partie "Excréments survenus" ? On dirait que le code est allé faire caca !
0 votes
@corlettk pourquoi devrait-on mettre throw à la fin du bloc catch ? quel est le but de ce throw ? le logger n'est-il pas suffisant pour enregistrer l'exception et la vie continue :D
0 votes
Ainsi, la différence entre conserver la pile de traces et la jeter est l'objet d'exception qui est inclus dans la commande
throw
déclaration, par exemple,throw
contrethrow e
? Ou est-ce que cela a à voir avec le type d'exception déclenchée, c'est-à-dire, est-ce quethrow aSqlException
conserver la trace de la pile ?0 votes
Depuis .NET 4.5, il existe un autre moyen :
ExceptionDispatchInfo.Capture(ex).Throw()
stackoverflow.com/a/17091351/1266906