返回类型为Exception是不错的编程?

时间:2014-03-19 15:01:31

标签: java exception error-handling ibm-integration-bus extended-sql

我在一个项目的用例中遇到了一个奇怪的情况: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子句。“

6 个答案:

答案 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,
    }