C#最佳实践error handling和传递错误消息

我正在使用asp.net,我总是在努力寻找一种处理错误的简洁方法,如果有的话,将错误消息传递给用户。 例如,我有一个User类,UserManager类和一个Database类。 Imagina我想显示所有用户,显示我从UserManager调用方法GetAllUsers返回User对象列表。 此方法创建一个Database对象并调用方法ExecuteQuery(字符串查询)。

编辑:现在我的问题,想象一下ExecuteQuery()方法出错(无法打开数据库)。 我想在打开数据库连接时通知用户出错了。 我应该怎么做并处理这个整洁的方式?

编辑2:

你会这样做吗? 或者其他?

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 GetAllUsers () { Database db = new Database() Dataset DS = db.ExecuteQuery("my query goes here"); (if DS == null) { _Error = db.Error; return null; } } } 

在单击事件的用户界面中:

 protected void onClick_event(args) { Usermanager userman = new UserManager(); List users = userman.GetAllUsers(); if(users == null) { // make a error panel visible pnlError.Visible = true; lblError.Text = userman.Error } } 

这是一个好方法吗?

我认为你错过了做exception处理的正确方法。 存储依赖于数据库的语言/语言环境的文本并不是一个好主意。 该错误在它执行的上下文中也可能没有意义,方法的调用者知道目的是什么,但是从数据库中检索值的代码不知道代码的“更高目标”! 数据库错误的描述可能根本不会引起用户兴趣,因为系统无法获得用户列表,这就是全部。 对于开发人员来说,了解究竟出了什么问题非常重要。 将其显示给用户可能还会向他们显示您不希望他们看到的数据,如表名,密码,数据库用户名,具体取决于exception包含的内容(您无法控制)

那么现在如何处理它:

  1. 捕获处理它的exception,即onClick_Event
  2. 注销文件详细信息,仅显示用户应该看到的页面
  3. 在您的代码(例如数据库)中遵循以下原则:

    • 在明确没有任何问题可以使对象保持一致状态之前,请不要修改对象的状态。 这意味着不要开始修改成员,然后exception到来,你必须将它们全部重置为finally块中的先前状态。
    • 开始你的操作并对问题抛出exception(不要在这里捕获它,没有意义,你只需存储一条消息或整个exception以便以后检索!)
    • 成功时,将临时变量复制到对象的成员

这样,您将始终拥有一致状态的对象和干净的代码。

这完全取决于您对查询执行的问题类型。 这些问题可能是从没有找到记录到连接失败的任何问题。 如果问题是你可以测试的,缺少记录,你可以测试它并向你的用户显示一条消息,说明没有找到记录。 即使连接失败,您也应该能够测试并告诉您的用户。

对于无法测试的问题,根据您编写的应用程序类型,您可能希望让应用程序失败并使用某些框架(如ELMAH日志)并报告错误。

尝试这些来自我在该主题的其他post的链接以获取更多信息

代码分析团队博客

马丁福勒 – 快速失败

关于exception处理的MSDN

已检查与未经检查的例外情况

此外, 这篇优秀文章最近发布

通过包装在using语句中或使用Try / Finally来确保数据库连接处理,因为特定类型的exception可能会给您带来麻烦。

Karl Seguin的这本免费书中有一章关于exception处理,应该让你清楚。

将exception冒泡到UI,根据您的风格可以处理它。 对于未处理的exception,如下所述,ELMAH非常有用。

如果您不想使用通常的try / catch并在catch中显示错误div,则会出现一个Page.Error事件 ,您可以使用该事件来捕获页面上下文中的句柄错误。 在其中,您将调用Server.GetLastError()以获取抛出的最后一个exception,然后通过将它们指向错误页面或通过在页面上显示/隐藏错误元素来通知用户出错。