2011-09-16 8 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); 
} 

ここで私は自分の例外を作成しました。ここでは、SqlExceptionをキャプチャするために@lastupdatetimeの代わりにスカラー変数@lastuptimeを指定しました。

ここは私のDatabaseExceptionクラスです。ここで

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

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

プログラムを実行している間、それは

sqlCommand.ExecuteQuery(); 

でエラーを示していますが、エラーをキャプチャし、メッセージボックスのテキストは表示されません。私は何かが間違っていることを知っている。カスタム例外処理を作成したのが正しいかどうかはわかりません。

誰でも助けてくれますか?前もって感謝します。

+0

また、例外を[Serializable]としてマークし、さらに2つのコンストラクタ(シリアル化のための非argコンストラクタと、カスタムシリアル化のargsとしてのSerializationInfoと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

catchの例外の型を知っていれば、if文の型をチェックするのではなく、catch(DatabaseException de){} catch(SQLiteException){} catch(NullRefer .. –

0

作成したDatabaseExceptionは、SqlCommandのプロパティとメソッドでスローされません。したがって、キャッチは決して引き起こされません。

Exception DatabaseExceptionを作成して呼び出すということは、すべての「データベース」コードが例外をスローすることを意味するものではありません。 SqlCommandが書かれたとき、非常に特定の例外セットをスローするように書かれていました。 SqlCommandとそのメソッドがMSDNにスローされた例外の一覧があります。

私の答えがあなたに合っていないかどうか教えてください。

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

をこれは私が(多かれ少なかれ)、このルーチンを作成する方法をです。ここで投げクラスに

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); 
    } 
関連する問題