-1

我正在创建一个数据访问层,我想在其中处理应由业务层捕获的异常,并清楚地了解异常的来源。我正在做这样的事情..

编辑

private void OpenConnection()
        {
                if (ConnectionState.Closed == _connection.State)
                    _connection.Open();
        }

在上面给出的代码中,我知道异常的原因。并想把它扔到BL处理来显示消息。

但是我在 DL 中仅使用其他一些代码行来使用此功能。

protected DataTable GetDataTable(string Query)
 {
     DataTable dt =new DataTable();
     SqlCommand cmd = InitializeCommand(Query);

     SqlDataAdapter adp = new SqlDataAdapter(cmd);
     try
     {
         OpenConnection();
         adp.Fill(dt);
         CloseConnection(true);
         return dt;
     }
     catch (SqlException ex)
     { throw ex; }
     finally
     {
         adp.Dispose();
         cmd.Dispose();
     }
 }

OpenConnection()现在,如果在尝试打开连接时发生异常,则应用程序throw ex在 OpenConnection 本身的行中崩溃,而我期望它返回异常。我应该如何处理这个问题。此外,如果发生异常,则在第二个函数中扩展我的问题,GetDataTable应该抛出什么样的异常,其细节与此时发生的相同以及如何发生。我只知道这种方式,但这是我认为的一种方式。

throw new ApplicationException(ex.message,ex.innerexception)

编辑

假设与服务器的连接丢失或我使用了错误的连接字符串。现在我使用 BL 的 GetDataTable 函数。哪里会发生异常,我应该在哪里处理?我想知道DL中出现的问题。考虑到BL不知道DL的代码

4

2 回答 2

1

您可以做几件事。

您可以有不同的try块,并根据您遇到问题的位置抛出新的异常:

 try
 {
     OpenConnection();
     adp.Fill(dt);
 }
 catch (SqlException ex)
 { throw new SqlException("Could not open/populate", ex); }
 finally
 {
     adp.Dispose();
     cmd.Dispose();
 }

 try
 {
     CloseConnection(true);
     return dt;
 }
 catch (SqlException ex)
 { throw new SqlException("Could not close connection", ex); }
 finally
 {
     adp.Dispose();
     cmd.Dispose();
 }
于 2010-07-08T08:34:41.137 回答
0

我的建议是删除捕获并重新抛出,因为这会破坏异常的堆栈跟踪。您可以尝试不捕获,因为无论如何您都会抛出异常。通过这种方式,您可以保留堆栈跟踪并仍然使用 finally:

protected DataTable GetDataTable(string Query)
 {
     DataTable dt =new DataTable();
     SqlCommand cmd = InitializeCommand(Query);

     SqlDataAdapter adp = new SqlDataAdapter(cmd);
     try
     {
         OpenConnection();
         adp.Fill(dt);
         CloseConnection(true);
         return dt;
     }
     finally
     {
         adp.Dispose();
         cmd.Dispose();
     }
 }
于 2010-07-08T08:42:04.263 回答