C# les meilleures pratiques de gestion d'erreur et de passer des messages d'erreur
Je suis en utilisant asp.net et je suis toujours à la lutte pour une belle façon de gérer les erreurs et si il y a de tout, pour passer le errormessage à l'utilisateur. Pour exemple, j'ai une classe Utilisateur, UserManager classe et une classe de Base de données. Imagina je veux montrer à tous les utilisateurs, un spectacle que j'ai appeler la méthode GetAllUsers de UserManagerwhich retourne une liste d'objets Utilisateur. Cette méthode crée un objet de Base de données et les appels de la méthode ExecuteQuery(string query).
EDIT:
Et maintenant, mon problème, imaginer quelque chose va mal dans le ExecuteQuery (), méthode (impossible d'ouvrir la base de données). Je tiens à informer l'utilisateur de quelque chose s'est mal passé lors de l'ouverture de la connexion de base de données. Comment dois-je faire et gérer cela d'une façon soignée?
EDIT 2:
Voulez-vous faire quelque chose comme cela? Ou autrement?
public class Database()
{
private string _Error;
//property error (only get)
private void Open()
{
try
{
//Open DB
//Fails because of error
}
catch(Exception ex)
{
_Error = ex.Message;
}
}
public DataSet ExecuteQuery(string query)
{
try
{
Open();
//Execute query
//return dataset
}
catch(Exception ex)
{
_Error = ex.Message;
return null;
}
}
}
public class UserManager ()
{
private string _Error;
//Get property for Error
public List<User> GetAllUsers ()
{
Database db = new Database()
Dataset DS = db.ExecuteQuery("my query goes here");
(if DS == null)
{
_Error = db.Error;
return null;
}
}
}
Dans l'interface utilisateur sur un événement click:
protected void onClick_event(args)
{
Usermanager userman = new UserManager();
List<User> users = userman.GetAllUsers();
if(users == null)
{
//make a error panel visible
pnlError.Visible = true;
lblError.Text = userman.Error
}
}
Est-ce une bonne approche?
J'ai édité ma réponse ci-dessous avec quelques liens pour vous de regarder.
Que voulez-vous dire avec "bubble up"? Et comment faire pour le mettre en œuvre?
OriginalL'auteur Martijn | 2009-09-19
Vous devez vous connecter pour publier un commentaire.
Je pense que vous avez raté la bonne manière de faire la gestion des exceptions. De stockage du texte qui est de la langue/paramètres régionaux dépendant dans votre base de données n'est pas vraiment une bonne idée. L'erreur est peut-être pas de sens dans le contexte dans lequel il est exécuté, l'appelant de la méthode sait ce qui est prévu, mais le code qui récupère une valeur à partir d'une base de données ne sais pas à propos de la "des objectifs plus ambitieux" de votre code! La description de l'erreur de base de données pourrait également ne pas intérêt des utilisateurs à tous, pour eux, le système ne peut pas obtenir la liste des utilisateurs, c'est tout. Pour les développeurs, il est important de savoir qu'est-ce exactement a obtenu le mal. Cette mise visibles par les utilisateurs peuvent également afficher les données que vous ne voulez pas les voir comme des noms de table, mots de passe, base de données des noms d'utilisateur, en fonction de ce que l'exception contient (vous ne pouvez pas le contrôle)
Alors maintenant, comment le gérer:
onClick_Event
Dans votre code (Base de données, par exemple) suivre ce principe:
De cette façon, vous auriez toujours un objet dans un état cohérent et propre code.
OriginalL'auteur jdehaan
Tout dépend du type de problème que vous avez avec l'exécution de la requête. Ces questions pourraient être quelque chose de pas d'enregistrements trouvés pour un branchement non. Si le problème est quelque chose que vous pouvez tester pour qui l'absence de documents, vous pouvez tester et présenter votre utilisateur avec un message indiquant qu'aucun enregistrement n'a été trouvé. Même si la connexion échoue, vous devriez être en mesure de tester et dites à votre utilisateur.
Pour les problèmes vous ne pouvez pas tester, selon le type de demande que vous avez écrit, vous pouvez laisser l'application échoue et utiliser un framework comme ELMAH journal et signaler l'erreur.
essayez ces liens qui viennent de mon d'autres post sur ce sujet pour plus d'informations
L'Analyse Du Code Blog De L'Équipe
Martin Fowler - Échouer Rapidement
MSDN sur la Manipulation d'Exception
Vérifié vs Décoché Exceptions
Aussi, cet excellent article a été posté récemment
OriginalL'auteur jlembke
Soit en les enveloppant dans un à l'aide de déclaration ou d'avoir un Try/finally pour assurer la connexion db est disposé, en tant que type particulier d'exception pourrait être un problème pour vous.
Ce livre gratuit par Karl Seguin a un chapitre sur la Manipulation d'Exception qui devrait rendre les choses assez clair pour vous.
Bulle jusqu'à l'exception de l'INTERFACE utilisateur, où il peut être manipulé en fonction de votre style là. Pour les exceptions non gérées, comme mentionné ci-dessous, en apparence, est tres utile.
la bulle de l'exception à la ultrapériphériques point et puis c'est la responsabilité de votre INTERFACE utilisateur de décider ce que pour montrer à l'utilisateur en fonction du type de l'exception. Sauf si vous ajoutez plus d'informations à l'exception ceci est le premier endroit que vous devriez être la capture de cette exception. Mais honnêtement, prendre une lecture du chapitre dans ce livre, il est difficile de répondre à cette question dans l'isolement, trop de choses à prendre en compte.
J'ai édité mon startpost. Vouliez-vous dire quelque chose comme ça?
en bref, pas. je n'aurais pas l'un de ceux qui essaient de captures dans votre couche de données. les amener dans votre dans votre événement onclick. et puisque vous êtes tout simplement de l'affichage de la excecption message, quelque chose de plus générique pourrait être appliquée. Encore une fois, il existe de nombreux exemples d'ici et d'ailleurs de quoi faire. Une chose importante à vous poser est: pourquoi êtes-vous à la capture d'exceptions dans la base de données de couche depuis que vous ajoutez pas d'informations à l'exception, de ne rien faire pour se connecter ou d'essayer quelque chose pour y remédier. dans ce cas il suffit de laisser l'exception de la bulle jusqu'à ce que vous voulez faire quelque chose de spécifique à elle
Comment puis-je remonter une exception?
OriginalL'auteur dove
Si vous ne souhaitez pas utiliser l'habituel try/catch et de l'erreur d'affichage de la balise div dans le catch il y a ensuite un Page.Événement d'erreur que vous pourriez utiliser pour attraper gérer les erreurs avec le contexte de votre page. Dans ce que vous appelez le Serveur.GetLastError() pour obtenir la dernière exception et d'en informer l'utilisateur quelque chose s'est mal passé, en les orientant vers une page d'erreur, ou par affichage/masquage d'erreur des éléments sur votre page.
OriginalL'auteur blowdart