C# 最佳实践错误处理和传递错误消息

标签 c# asp.net .net logging error-handling

我正在使用 asp.net,我一直在努力寻找一种巧妙的方法来处理错误,如果有错误,则将错误消息传递给用户。例如,我有一个 User 类、UserManager 类和一个 Database 类。想象一下,我想显示所有用户,显示我从 UserManager 调用方法 GetAllUsers,它返回一个 User 对象列表。此方法创建一个数据库对象并调用方法 ExecuteQuery(string query)。

编辑: 现在我的问题是,假设 ExecuteQuery() 方法出现问题(无法打开数据库)。我想通知用户打开数据库连接时出了点问题。我应该如何做到这一点并以一种巧妙的方式处理它?<​​/p>

编辑 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<User> 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<User> users = userman.GetAllUsers();

  if(users == null)
  {
    // make a error panel visible
    pnlError.Visible = true;
    lblError.Text = userman.Error
  }
}

这是一个好方法吗?

最佳答案

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

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

尝试这些来 self 的 other post 的链接有关此主题的更多信息

Code Analysis Team Blog

Martin Fowler - Fail Fast

MSDN on Exception Handling

Checked vs Unchecked Exceptions

此外,this excellent article最近发布了

关于C# 最佳实践错误处理和传递错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1448025/

相关文章:

asp.net - 在没有 IIS 和 VS 2017 的情况下使用 Kestrel

c# - 在文本框中输入值之前出现确认密码消息

.net - 是否有支持简单编程配置的 .Net 日志记录框架?

java - 为什么 Java(但不是 .NET)无法在不需要原始类型/类型删除的情况下适应泛型?

javascript - 使用jquery ajax使用.net从客户端上传文件

c# - 从 C# 中的路径拆分文件名和扩展名

c# - oAuth 2.0 API 使用 C#

c# - 在 C# 中提取字符串末尾的数字

c# - 离线登录 Unity 3D 和 PHP Laravel

c# - 了解 ASP.NET MVC 中的路由