如何从java异常中获取原因

时间:2011-06-18 07:45:22

标签: java jdbc exception-handling sqlexception jdbc-odbc

当我连接到数据库并执行查询时,如果发生任何异常,那么我只想获取异常而不是完整消息的原因,这样在我的日志中我只能记录异常的原因,例如。下面的一个例外是在catch块中的异常对象上应用getMessage() [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]无效的对象名称't​​ty'。

所以我只想获取“无效的对象名称't​​ty'”。

仅由于executeUpdate()方法而发生异常。所以异常可能是与数据库或sqlquery相关的任何事情,而不仅仅是无效的对象名称't​​ty'。

2 个答案:

答案 0 :(得分:2)

我在SQLException中看不到任何明显的东西,但我可以想到两个选项:

  • 删除方括号中的所有内容,可能使用正则表达式。
  • 如果您始终使用相同的驱动程序,只需删除前导可预测的前导子字符串

第二个选项的示例代码:

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());
}

这可能比第一种选择容易得多,但在驾驶员变化时显然更加脆弱。不管怎么说,看到不同驱动程序的消息格式改变,我也不会感到惊讶......

答案 1 :(得分:0)

正如@Jon Skeet建议我更好地使用正则表达式的第一个选项并在catch块中应用以下代码 模式p = Pattern.compile(“\ [。* \]”);
Matcher m = p.matcher(e.getMessage());
int end = 0;
而(m.find()){
端= m.end();
System.out.println(m.start()+“”+ m.end());
}

的System.out.println(e.getMessage());
的System.out.println(e.getMessage()子串(结束));
然后它给出以下输出

0 47
[Microsoft] [ODBC SQL Server驱动程序] [SQL Server]无效的对象名称't​​ty' 无效的对象名称't​​ty'。