2

という名前のテーブルにデータを挿入しようとしていますrmas

テーブル形式は

|rcode|rname|vcode|vanme

ここでは、rcode の主キーを設定します。

既存の rcode を使用してレコードを挿入すると、ORA-0000-1 unique constraint Violated のようなものが表示されます。

次のコードを使用している場合、他のエラーの場合でもメッセージが表示されます。

catch(Exception e)
{
 //out.println("rcode already exists");
}

したがって、その主キーの例外のみをキャッチして、「rcode は既に存在します」と表示したいと考えています。出来ますか?はいの場合、どのように?

前もって感謝します

4

5 に答える 5

8

Exceptionすべての例外の親です。ブロックが書き込まれている場合catch(Exception e) { }、すべての例外がこのカテゴリに分類されます。コンパイラが返す例外を見つける必要があります。コンパイラがこの例外を返した場合SQLIntegrityConstraintViolationException、次のブロックが来るとします

catch(SQLIntegrityConstraintViolationException e) 
{
  // Error message for integrity constraint violation
}
catch(NullPointerException e)
{
  // Null Pointer exception occured.
}
catch(Exception e)
{
 // Other error messages
}

このようにして、任意の数の例外ブロックを持つことができます。ただし、より具体的な例外タイプが最初に記述され、次に親例外が記述されていることを確認してください

于 2013-02-14T12:10:12.083 に答える
1

Exceptionすべての例外のスーパークラスである をキャッチしています。これを捕まえることで、ポケモンスタイル(「すべて捕まえる!」)を使用します。これは、そのブロックでスローされた特定の例外に基づいてさまざまなアクションコースを実行する能力を失うため、一般的に悪い習慣です。コード。

例外ごとにメッセージが表示されないように、制約違反に関連する例外のみをキャッチします。

サーブレットでこれを実行したい理由はわかりませんが、ソリューションのアーキテクチャを確認し、階層化されたアプローチを提供して、永続層でこの例外をキャッチし、メッセージを定義する独自の結果コードを返すことをお勧めしますユーザーに表示する必要があります。

注:エラー コードではなく結果コードを使用して、操作が成功したことを示すコードを返すようにしました。

于 2013-02-14T12:05:39.023 に答える
0

私は次の方法でキャッチします:

catch(Exception ex){
      if(ex.getMessage().contains("UNIQUE KEY"))
           return "Error - Unique Key Violation!!";
      else if(ex.getMessage().contains("FOREIGN KEY"))
           return "Error - Foreign Key Violation!!";
      else
          return "Other Error: " + ex.getMessage();
}

シンプルで機能的であることを願っています!!

于 2020-02-09T13:40:25.733 に答える
0

サーブレットにそのようなコードはありません。あなたの永続層にあるクラスに属していると思います。サーブレットは HTTP リスナーです。データベース コードを含めるべきではありません。

インターフェイスベースの永続性クラスでその例外をキャッチし、適切に処理します。永続化クラスを使用してユース ケースを満たすインターフェイス ベースのサービスを記述します。サーブレットがサービスを呼び出し、何が起こったかに基づいて次に何を表示するかを決定します。

それは階層化アーキテクチャと呼ばれます。強くお勧めします。

于 2013-02-14T12:05:58.490 に答える