2011-09-16 41 views
4

我想在windows窗體應用程序中創建自己的異常。我正試圖將一些數據添加到數據庫中。如何在c中創建自定義異常#

代碼:

try 
{ 
    string insertData = string.Format("INSERT INTO " + constants.PIZZABROADCASTTABLE + 
     " VALUES(@starttime,@endtime,@lastupdatetime,@applicationname)"); 
    sqlCommand = new SqlCommand(insertData, databaseConnectivity.connection); 
    sqlCommand.Parameters.AddWithValue("@starttime", broadcastStartDateTime); 
    sqlCommand.Parameters.AddWithValue("@endtime", broadcastEndDateTime); 
    sqlCommand.Parameters.AddWithValue("@lastuptime", currentDateTime); 
    sqlCommand.Parameters.AddWithValue("@applicationname", txtApplicationName.Text); 
    sqlCommand.ExecuteNonQuery(); 
} 
catch (DataBaseException ex) 
{ 
    MessageBox.Show(ex.Message); 
} 

在這裏,我已經創建了自己的異常。這裏我已經給出了標量變量@lastuptime而不是@lastupdatetime來捕獲SqlException。

這是我的DatabaseException類。

class DataBaseException : Exception 
{ 
    public DataBaseException(string Message) 
     : base(Message) 
    { 

    } 
    public DataBaseException(string message, Exception innerException) 
     : base(message, innerException) 
    { 
    } 
} 

這裏同時運行的程序它顯示在

sqlCommand.ExecuteQuery(); 

錯誤,但它並沒有捕捉到錯誤並顯示在消息框中的文本。我知道我做錯了一些事情。我不知道我創建的自定義異常處理是對還是錯。

任何人都可以幫助我嗎?提前致謝。

+0

您還應該將您的Exception標記爲[Serializable]並添加兩個更多的構造函數(一個用於序列化的非參數構造函數,一個帶有Seri​​alizationInfo和StreamingContext的構造函數作爲用於自定義序列化的參數)。 – Daniel

回答

2

您需要拋出自定義異常,以便可以通過調用方法捕獲它。在你的代碼中,程序會拋出DB的異常,而不是你的自定義異常。

void UpdateDatabase() 
{ 
//... 
     try 
      { 

      } 
       // Your checks to identify - type of exception 
       // ... 
       // .net exception 
       // Throw your custom exception in the appropriate block - 
       // throw new DatabaseException(); 
      catch (OutOfMemoryException ex1) 
      { 

      } 
      catch (InvalidDataException ex2) 
      { 

      } 
      // Generic exception 
      catch (Exception ex3) 
      { 
       // throw new DatabaseException(); 
      } 
//.... 
} 

// Method calling UpdateDatabase need to handle Custom exception 
void CallUpdateDatabase() 
{ 
try 
    { 
    UpdateDatabase(); 
    } 
    catch(DatabaseException dbEx) 
    { 
    // Handle your custom exception 
    } 
} 
+2

您可能希望提供一個構造函數來接受異常對象,以便保留內部異常。 –

+0

如果您知道要捕獲的異常類型,而不是在if語句中檢查類型,請專門捕獲它們(即catch(DatabaseException de){} catch(SQLiteException){} catch(NullRefer .. –

0

沒有任何SqlCommand屬性和方法會拋出您創建的DatabaseException。因此,你的捕獲永遠不會觸發。

您創建並調用Exception DatabaseException的事實並不意味着所有的「數據庫」代碼現在都會拋出異常。當編寫SqlCommand時,它被寫入拋出一組非常特殊的異常。您可以在MSDN上找到SqlCommand及其方法的異常列表。

讓我知道我的答案對你沒有意義。

0

自己的異常是好的,但Sql.ExecuteQuery會拋出SQLException,你可以做這樣的事情:

void CallDatabase(/* your parameters */) 
{ 
    try 
    { 
     string insertData = string.Format("INSERT INTO " + constants.PIZZABROADCASTTABLE + " VALUES(@starttime,@endtime,@lastupdatetime,@applicationname)"); 
     sqlCommand = new SqlCommand(insertData, databaseConnectivity.connection); 
     sqlCommand.Parameters.AddWithValue("@starttime", broadcastStartDateTime); 
     sqlCommand.Parameters.AddWithValue("@endtime", broadcastEndDateTime); 
     sqlCommand.Parameters.AddWithValue("@lastuptime", currentDateTime); 
     sqlCommand.Parameters.AddWithValue("@applicationname", txtApplicationName.Text); 
     sqlCommand.ExecuteNonQuery(); 

    } 
    catch (SqlException ex) 
    { 
     throw new DataBaseException("Database error", ex); 
    } 
} 

/* somewhere in your code */ 
try 
{ 
    CallDatabase(...); 
} 
catch (DataBaseException ex) 
{ 
    MessageBox.Show(ex.Message); 
} 
0

這是我怎麼會寫這個程序(或多或少)。請確保您關閉數據庫連接,並使用使用結構,以騰出的SqlCommand OBJ:

try 
    { 
     string insertData = string.Format("INSERT INTO " + constants.PIZZABROADCASTTABLE + " VALUES(@starttime,@endtime,@lastupdatetime,@applicationname)"); 
     using (sqlCommand = new SqlCommand(insertData, databaseConnectivity.connection)) 
     { 
      sqlCommand.Parameters.AddWithValue("@starttime", broadcastStartDateTime); 
      sqlCommand.Parameters.AddWithValue("@endtime", broadcastEndDateTime); 
      sqlCommand.Parameters.AddWithValue("@lastuptime", currentDateTime); 
      sqlCommand.Parameters.AddWithValue("@applicationname", txtApplicationName.Text); 

      sqlCommand.ExecuteNonQuery(); 
     } 
    } 
    catch (Exception ex) 
    { 
     string s = "Failed to insert into table " + constants.PIZZABROADCASTTABLE + "Database Error! " + Environment.NewLine + "Details: " + ex.ToString(); 
     MessageBox.Show(s, MessageBoxButtons.OK, MessageBoxIcons.Error); 
     // Or 
     //throw new DatabaseException(s, ex); 
    } 
    finally 
    { 
     if (databaseConnectivity != null && databaseConnectivity.connection != null) 
      databaseConnectivity.connection.Close(); 
     else 
      MessageBox.Show("No database connectivity!", "Error", MessageBoxButtons.OK, MessageBoxIcons.Error); 
    } 
相關問題