【问题标题】:how to fetch only reason from java exception如何从java异常中仅获取原因
【发布时间】:2011-06-18 07:45:21
【问题描述】:

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

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

该异常只会由于 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”无效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      相关资源
      最近更新 更多