1

理由がわかりません... 2 つの例外がスローされましたが、それらをキャッチできません。

libには、2種類の例外をスローするこのコードがあります。

try {
    statement = con.prepareStatement(query);
    if (statement.executeUpdate() != 1) {
        throw new InvalidIndexException("Record not found or not modified", query);
    }
} catch (SQLException e) {
    throw new DatabaseIOException(e, "", "SQL Error", logQuery);
}

クエリは、SQL エラーをトリガーするように変更されます。それが発生すると、ログエントリが 1 つあります。

2013-04-26 12:19:39 class database.DatabaseIOException
userManagement.Login.setActivationFlag(Login.java:473) 
-> SQL Error
[QUERY]: UPDATE login SET activationprTTTTocess='false' WHERE  id=235423432
[MSG]: ERROR: column "activationprttttocess" of relation "login" does not exis

だから私は sqlerror がキャプチャされ、DatabaseIOExceptionとして再スローされたと確信しています.Netbeansでもデバッグモードでコードを実行しました。今のところ大丈夫です。

これで、ユーザーをアクティブ化しようとするサーブレットができました。

try{
   Login.setActivationFlag(235423432, false);
} catch (DatabaseIOException db) {
   Log.addItem(db.getMessage());
} catch (InvalidIndexException ed){
   Log.addItem(ed.getMessage());
}

私が試してみたところ、キャッチブロックに入る方法はありません。Login.setActivationFlag行が実行されると、エラーがログに表示されますが (上記のように)、catch ブロックは何も追加されていないかのようにスキップされます

この奇妙な動作の理由がわかりません。私はこれらの例外を3年間問題なく使用しています...このコードには、私には見えない何か本当にばかげたものがあるはずです....

4

2 に答える 2

-1

約 4 時間のデバッグの後、私はそれが何であるかを知りました: 例外を処理するときの悪いことです。

setActivationFlag() では、returnステートメントが間違って配置されていました... finally ブロックに落ちました。

...
   } finally {
      ...
      return done;
   }
}

それ以外の

...
   } finally {
       ...
   }
   return done;
}

編集:ここでテストするコードの一部

public void ExceptionTest() throws Exception {
    try {
        Integer test = null;
        test.toString();
    } catch (NullPointerException e) {
        out.println("Catched inner NullPointerException");
            throw new Exception("My Exception", e);
    } finally {
        return;
    }
}

public void test() {
    try {
        ExceptionTest();
    } catch (Exception outer) {
        out.println("Catched: " + outer.getMessage());
    }
}

finallyブロックのreturnステートメントを使用すると、外側の例外がキャッチされることはありません。

于 2013-04-26T12:17:40.857 に答える