10

我在一个项目的用例中遇到了一个奇怪的情况:ESQL 正在调用一个 java 方法,向它发送一个字符串输入参数,该方法将解组,应用一些逻辑,然后存储来自解组对象的有用信息。因此,该方法必须要么抛出 JAXBException,要么使用 try catch 来处理可能的异常。

这样做的问题是,ESQL 不能调用在签名中包含 throws 的 java 方法。但是,我们希望任何错误都回落到先前调用的 MBNode 上,以便可以在那里适当地处理它,因此 trycatch 就不存在了。

让我震惊的是,嘿,当我们遇到问题时不可能返回一种类型的异常,如果不是则返回 null 吗?所以我写了一个简单的方法这样做,虽然我没有收到任何警告或错误,但在良好的编程意义上,这对我来说似乎是错误的。

例如:

public Exception doStuffAndCheckForErorrs(String inString)
{
    if(inString.equals(null))
    {
       return new Exception("Your string is null");
    }
    else
    return null;
}

但我只是对以这种方式做任何事情有一种可怕的感觉。

我对任何想法或不同的解决方案持开放态度,特别是如果有办法解决 ESQL 签名问题。

更新

添加关于为什么 ESQL 过程不能在签名中调用带有 throws 子句的 java 方法的参考。

摘自CREATE PROCEDURE 语句部分下的此链接:

“您要调用的任何 Java 方法必须具有以下基本签名:public static (<0 - N parameters>) where 必须在 ESQL 到 Java 数据类型映射表中的 Java IN 数据类型列表中(不包括REFERENCE 类型,不允许作为返回值),或者 Java void 数据类型。参数数据类型也必须在 ESQL 到 Java 数据类型映射表中。另外,Java 方法不允许有异常签名中的 throws 子句。”

4

6 回答 6

1

这实际上不是关于 Java 的问题,而是关于 ESQL 的问题。

ESQL 能够处理通过 JNI 将 Java 异常抛出到 ESQL 代码中,您应该会收到 BIP2917 错误。

我最初虽然这可能是 ESQL 方法解析器的问题,但在 IIB v9 上,我能够成功调用以下方法:

public static void sayHello() throws Exception{
  System.out.println("hello");
}

这让我觉得您的 ESQL 外部函数/过程定义可能有其他问题?

于 2014-03-20T17:51:08.300 回答
1

这里的重点是你不能声明会抛出异常;您仍然可以抛出 RuntimeException - 无需添加 throws 子句。

因此,如果您将 JAXBException 包装到 RuntimeException 中,您可以根据您的要求抛出并处理它,而不会破坏任何一个要求。不知道我是否会这样做;我不想返回异常类型,因为它不打算用作返回码。

请特别确保这种处理问题的异步方式不会破坏 ESQL 库,因为您将绕过他们的部分代码,可能会使部分代码挂起。

于 2014-03-24T10:55:33.177 回答
0

返回异常是“又快又脏”。它可能非常强大和有用,但如果可能的话应该避免这样做。

ESQL 中的调用是这样进行的,原因很充分,我不会在这里解释,但您可以使用方法定义中未出现的 RuntimeException 绕过它。

于 2014-03-19T15:17:22.673 回答
0

指定抛出异常的用例听起来可能写得不好。抛出异常的业务或架构原因是什么?

另一种方法是抛出 RuntimeException 或自定义子类。这将允许您将其排除在方法签名之外。

同样,用例似乎很奇怪。

于 2014-03-19T15:23:34.340 回答
0

您的问题的直接答案是:

不,返回类型为 Exception 的编程不好。该机制旨在在出现问题时发生,因此返回类型 Exception 意味着您希望收到出现问题的后果。

我知道你不能抛出异常,所以你应该用其他方法处理这个案例。

当你想检查一些工作时,布尔方法很好:好=返回真,坏=返回假。

当你想要获取工作的结果时,将值封装在 Object 中意味着:good = return new YourResultObject(val1, val2, ..., valx), bad = return null。

于 2014-03-20T11:21:22.683 回答
0

你可以做的是使用返回码,就像 C 程序用来报告它们的状态一样。

或者,您也可以创建一个 Enum 并返回 Enum,如果您想区分不同类型的错误,两者都比布尔方法更灵活

    public Enum ReturnCodes {
         SUCCESS,
         NULLSTRING,
         ...,
         OTHERERROR,
    }
于 2014-03-20T11:31:00.597 回答