0

データベースに接続してクエリを実行するときに、例外が発生した場合は、メッセージ全体ではなく、例外の理由のみをフェッチする必要があります。これにより、たとえば、例外の理由のみをログに記録できます。以下に、catchブロックの例外オブジェクトにgetMessage()を適用することによる1つの例外を示します
[Microsoft] [ODBCSQLServerドライバー][SQLServer]無効なオブジェクト名'tty'。

したがって、「無効なオブジェクト名'tty'」のみをフェッチしたいと思います。

例外は、executeUpdate()メソッドが原因でのみ発生します。したがって、例外は、無効なオブジェクト名'tty'だけでなく、データベースまたはsqlqueryに関連するものである可能性があります。

4

2 に答える 2

2

で明らかなものは何も見えませんSQLExceptionが、2つのオプションが考えられます。

  • おそらく正規表現を使用して、角かっこで囲まれたすべてのものを削除します。
  • 常に同じドライバーを使用している場合は、先頭の予測可能な先頭の部分文字列を削除するだけです

2番目のオプションのサンプルコード:

private static final String MESSAGE_PREFIX =
    "[Microsoft][ODBC SQL Server Driver][SQL Server]";

...

String message = exception.getMessage();
if (message.startsWith(MESSAGE_PREFIX))
{
    message = message.substring(MESSAGE_PREFIX.length());
}

これは最初のオプションよりもかなり簡単である可能性がありますが、ドライバーの変更に直面すると明らかにかなり脆弱になります。とにかく、さまざまなドライバのメッセージ形式が変更されても驚かないでしょう...

于 2011-06-18T07:52:46.857 に答える
0

@Jon Skeetが提案したように、正規表現には最初のオプションを使用し、catchブロックに次のコードを適用する方がよいと思います
。Patternp = Pattern.compile( "\[。*\]");
マッチャーm=p.matcher(e.getMessage());
int end = 0;
while(m.find()){
end = m.end();
System.out.println(m.start()+ "" + m.end());
}

System.out.println(e.getMessage());
System.out.println(e.getMessage()。substring(end));
次に、次の出力が得られます

0 47
[Microsoft] [ODBCSQLServerドライバー][SQLServer]無効なオブジェクト名'tty'。
オブジェクト名'tty'が無効です。

于 2011-06-18T09:00:11.167 に答える