■質問日: |
2006/01/18 |
■最終更新日: |
2006/01/18 |
■質問内容: |
ClientRowSet#reslolveChanges(false);を行って例外が発生した場合に、 原因となったエラーがWDCの排他制御によるものか、あるいはSQLエラーによるものか、 それ以外か?を判別したい。 |
■回答内容: |
・WDCの排他制御によるエラーかどうかは、エラーメッセージにより判別します。 ・SQLエラーによるものかどうかは、原因となったExceptionがSQLExceptionか否かで 判別します。 |
■添付資料: |
・更新エラーの原因を判別する例 /** * 更新エラーの原因を取得するためのユーティリティクラス */ public final class WWBExceptionUtil { private WWBExceptionUtil() {} /** * WWBExceptionがデータベースの排他制御エラーが原因で発生したか?. * * ※現在のWDCでは、2を返すことはありません。 * * @param ex 調べたいWWBExceptionオブジェクト * @return -1:原因は排他制御エラーではない * 0:原因は排他制御エラー(DELETE) * 1:原因は排他制御エラー(UPDATE) * 2:原因は排他制御エラー(INSERT) */ public static int causedByExclusiveError(WWBException ex) { WWBException we = ex; while (we != null) { // getMessage()はLocaleを無視する。 String errmsg = we.getMessage(); if (errmsg != null) { for (int i=0; i if (errmsg.indexOf(Msg.ERROR_RESOLVING[i]) >= 0) { return i; } } } Exception e = we.getException(); if (!(e instanceof WWBException)) break; we = (WWBException)e; } return -1; } /** * ExceptionがデータベースのSQLエラーが原因で発生したか?. * * @param ex 調べたいExceptionオブジェクト * @return -1:原因はSQLエラーではない * 0以上:原因となったSQLエラーのコード */ public static int getSQLErrorCode(Exception ex) { Exception e = ex; while (e instanceof WWBException) { e = ((WWBException)e).getException(); } if (e instanceof SQLException) { return ((SQLException)e).getErrorCode(); } else { return -1; } } } 上記のWWBExceptionUtilの使用例 protected HtmlForm doExecute(Vector requestParamNames, Hashtable requestParamValues) throws java.lang.Exception { ... try { rowSets.resolveChanges(false); this.addNormalMessage("登録が完了しました。"); } catch (DataHandleException x) { final int exclusiveError = WWBExceptionUtil.causedByExclusiveError(x); if (exclusiveError >= 0) { this.addErrorMessage("排他制御エラーが発生しました。:" + Msg.ERROR_RESOLVING[exclusiveError]); } else { final int sqlErrorCode = WWBExceptionUtil.getSQLErrorCode(x); if (sqlErrorCode >= 0) { this.addErrorMessage("登録時にSQLエラーが発生しました。(ErrorCode=" + sqlErrorCode + "):" + x.getLocalizedMessage()); } else { this.addErrorMessage("登録時にエラーが発生しました。:" + x.getLocalizedMessage()); } } } return this; } |