【问题标题】:how to fetch only reason from java exception如何从java异常中仅获取原因
【发布时间】:2011-06-18 07:45:21
【问题描述】:
当我连接到数据库并执行查询时,如果发生任何异常,那么我只想获取异常的原因而不是完整的消息,这样在我的日志中我就可以只记录异常的原因。通过在 catch 块中的异常对象上应用 getMessage(),以下是一个异常
[Microsoft][ODBC SQL Server 驱动程序][SQL Server]对象名称“tty”无效。
所以我只想获取“无效的对象名称'tty'”。
该异常只会由于 executeUpdate() 方法而发生。所以异常可能是与数据库或 sqlquery 相关的任何内容,而不仅仅是 Invalid object name 'tty'。
【问题讨论】:
标签:
java
jdbc
exception-handling
sqlexception
jdbc-odbc
【解决方案1】:
我在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());
}
这可能比第一个选项容易得多,但在驱动程序更改时显然更脆弱。无论如何,看到不同驱动程序的消息格式发生变化,我不会感到惊讶......
【解决方案2】:
正如@Jon Skeet 建议的那样,我认为最好使用正则表达式的第一个选项并在 catch 块中应用以下代码
模式 p=Pattern.compile("\[.*\]");
匹配器 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().substring(end));
然后它给出以下输出
0 47
[Microsoft][ODBC SQL Server 驱动程序][SQL Server]无效的对象名称 'tty'。
对象名称“tty”无效。