我在一个项目的用例中遇到了一个奇怪的情况:ESQL正在调用一个java方法,向它发送一个String输入参数,该方法将解组,应用一些逻辑,然后存储来自unmarshalled对象的有用信息。因此,该方法必须抛出JAXBException,或者使用try catch来处理可能的异常。
问题在于,ESQL无法调用包含签名中的throws的java方法。但是,我们希望任何错误都会回落到先前调用的MBNode,因此可以在那里进行适当的处理,因此trycatch不在图片中。
让我感到震惊的是,遇到问题时是不可能返回一种Exception,如果没有则返回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声明部分的This link:
“您要调用的任何Java方法都必须具有以下基本签名: public static(< 0 - N参数>) 其中必须位于ESQL到Java数据类型映射表中的Java IN数据类型列表中(不包括REFERENCE类型,不允许作为返回值)或Java void数据类型。参数数据类型也必须位于ESQL到Java数据类型映射表中。此外, Java方法不允许在其签名中包含异常throws子句。“
答案 0 :(得分:1)
这不是关于Java的问题,而是关于ESQL的问题。
ESQL能够处理通过JNI抛出到ESQL代码中的Java异常,你应该收到BIP2917错误。
我最初虽然这可能是ESQL方法解析器的问题但是在IIB v9上我能够成功调用以下方法:
public static void sayHello() throws Exception{
System.out.println("hello");
}
这让我觉得你的ESQL外部函数/过程定义可能还有其他错误吗?
答案 1 :(得分:1)
这里的重点是你不能将DECLARE抛出异常;你仍然可以抛出一个RuntimeException - 而不添加throws子句。
因此,如果将JAXBException包装成RuntimeException,则可以根据需要抛出并处理,而不会破坏任何要求。不确定我是否愿意这样做;我不想返回异常类型,因为它不打算用作返回代码。
请确保这种处理问题的异步方式不会破坏ESQL库,因为您将绕过部分代码,可能会遗漏部分代码。
答案 2 :(得分:0)
返回异常是快速而又脏的"。它可以非常强大和有用,但如果可能的话应该避免这种情况。
ESQL中的调用是这样做的,原因很简单,我不会在这里解释,但你可以通过使用没有出现在方法定义中的RuntimeException来绕过它。
答案 3 :(得分:0)
指定抛出异常的用例听起来可能写得不好。 抛出异常的业务或架构原因是什么?
另一种方法是抛出RuntimeException或自定义子类。 这将允许您将其从方法签名中删除。
同样,用例似乎很奇怪。
答案 4 :(得分:0)
您问题的直截了当的答案是:
不,返回类型为Exception并不是一个好的编程。 该机制意味着在出现问题时发生,因此返回类型的Exception意味着您希望收到出错的后果。
我知道你不能抛出异常,所以你应该用其他方法处理这个案例。
当你想检查一些工作时,boolean aproach很好:good = return true,bad = return false。
当您想要获取工作结果时,意味着对Object中值的封装:good = return new YourResultObject(val1,val2,...,valx),bad = return null。
答案 5 :(得分:0)
你能做的就是使用C程序之类的返回代码来报告他们的状态。
或者你也可以创建一个枚举并返回枚举,如果你想区分不同类型的错误,两者都比布尔方法更灵活
public Enum ReturnCodes {
SUCCESS,
NULLSTRING,
...,
OTHERERROR,
}