【问题标题】:How to catch "Invalid hex digit"?如何捕捉“无效的十六进制数字”?
【发布时间】:2014-06-30 09:20:51
【问题描述】:

我有一个程序,其中抛出了 SQLException:

java.sql.SQLException: Fail to convert to internal representation: Invalid hex digit

oracle.sql.RAW.hexString2Bytes 中抛出错误,因为输入数据无效。

如何在不捕获所有其他 SQLExceptions 的情况下捕获此特定错误?

【问题讨论】:

    标签: java sql oracle exception-handling


    【解决方案1】:

    你可以通过两种方法获得它。

    一个是SQLException#getErrorCode(),它将返回一个int,即SQLException对象的特定于供应商的异常代码,并比较int(我不知道“无效的十六进制数字”的异常代码,但也许你可以通过System.out.println() 得到这个)

    另外一种方法是你可以通过Throwable#getMessage()获取异常消息并检查消息字符串。

    进一步你可以参考:Retrieving Exceptions

    【讨论】:

    • 我认为设置错误代码的可能性不大,因为它不是数据库错误而是驱动程序错误。
    • @RobbyCornelissen 我现在没有资源来测试它,但是你可以测试它,删除数据库 jar 文件并打印错误代码,你会得到我认为找不到类的错误代码。
    • 错误代码是 17059。它真的是特定于供应商的吗?这意味着,如果我切换 dbms,我必须重写异常处理。
    • @ceving 是的,对于其他一些供应商的错误代码可能会有所不同,但要不重写代码,您可以在配置文件(属性)中设置某个位置并从那里检索,因此将来,以防万一你改变你的数据库供应商,你不需要玩现有的代码。只需更新属性。
    【解决方案2】:

    您可以处理您的异常,检查条件是否要处理。如果不处理,可以将原来的异常抛出到外层的catch块中处理。

    try {
        ... your code here ...
    } catch (SqlException e) {
        if (e.getErrorCode() == ...) {
            ... do your exception handling
        } else {
            throw e;  // <-- re-throw the original Exception
        }
    }
    

    【讨论】:

      【解决方案3】:

      你不能这样做。 Java 根据其类型捕获异常(在本例中为SQLException)。但是,您仍然可以捕获所有SQLException 对象,检查异常消息,然后只处理您感兴趣的那些异常(那些具有指定消息的异常)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-07
        • 2012-11-24
        • 2012-06-17
        • 2016-11-14
        • 2016-03-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多