Java 有返回类型的异常是好的编程吗?

Java 有返回类型的异常是好的编程吗?,java,exception,error-handling,ibm-integration-bus,extended-sql,Java,Exception,Error Handling,Ibm Integration Bus,Extended Sql,在一个项目的用例中,我遇到了一个奇怪的情况:ESQL正在调用一个java方法,向它发送一个字符串输入参数,该方法将解组,应用一些逻辑,然后存储来自解组对象的有用信息。因此,该方法必须抛出JAXBException,或者使用try-catch来处理可能的异常 问题在于,ESQL无法调用在签名中包含抛出的java方法。但是,我们希望任何错误都返回到以前调用的MBNode,以便在那里可以适当地处理它,因此trycatch就不存在了 我突然想到,当我们遇到问题时,是否不可能返回一种类型的异常,如果不可能

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

问题在于,ESQL无法调用在签名中包含抛出的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方法的参考

摘自CREATEPROCEDURE语句部分:

“要调用的任何Java方法必须具有以下基本签名: 公共静态(<0-N参数>) 其中必须在ESQL到Java数据类型映射表中的Java in数据类型列表中(不包括引用类型,该类型不允许作为返回值),或Java void数据类型。参数数据类型也必须在ESQL到Java数据类型映射表中。此外,Java方法的签名中不允许有异常抛出子句。

返回的异常为“快速且脏”。它可能非常强大和有用,但如果可能的话,应该避免这种情况


ESQL中的调用是这样进行的,我在这里不作解释,但您可以通过使用方法定义中未出现的RuntimeException来绕过它。

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

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


同样,这个用例看起来很奇怪。

您的问题的简单答案是:

不,有返回类型的异常是不好的编程。 该机制意味着在出现错误时发生,因此返回类型的异常意味着您希望接收出错的结果

我理解您不能抛出异常,所以您应该使用其他方法处理该情况

当您想要检查某些工作时,布尔aproach是好的:good=returntrue,bad=returnfalse


当您想要获取工作结果时,对象中的值的封装就意味着:good=返回新的YourResultObject(val1,val2,…,valx),bad=返回null。

您可以使用返回代码,如用于报告其状态的C程序

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

    public Enum ReturnCodes {
         SUCCESS,
         NULLSTRING,
         ...,
         OTHERERROR,
    }

这不是一个关于Java的问题,而是一个关于ESQL的问题

ESQL能够处理通过JNI抛出到ESQL代码中的Java异常,您应该会得到一个BIP2917错误

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

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

这让我想到,您的ESQL外部函数/过程定义可能有其他错误?

这里的要点是您不能声明将引发异常;您仍然可以抛出RuntimeException,而无需添加throws子句

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


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

为什么要这样做?只需添加一个
null
检查。如果你真的想做这样的事情,用布尔标志。返回
异常
似乎是个坏主意,除非你真的有这样的要求。@AniketThakur请阅读完整的问题/帖子。是的,我确实有这样的要求,否则我就不会发帖了。如果您试图返回一个异常,请使用throws并让调用方法捕获该异常也许更简洁的方法是使用自定义返回类型,将ErrorFlag封装为布尔数据成员,以及可选的异常类型和消息作为字符串数据成员,并返回该自定义类型?我宁愿通过使用未检查的(也称为运行时)异常来绕过ESQL的限制。您能在这里解释一下吗?像您建议的旁路是我正在寻找的,也是首选的解决方案,因为它不需要任何奇特的返回类型。如果您还可以详细说明为什么ESQL中的调用是以这种方式进行的,而不是“出于合理的理由”,这将有助于更好地理解这种情况。有关此主题的更多信息,请查看。grosso modo,这是一个数据类型的问题,据我所知,它实际上是在抛出异常时工作的,但我想我应该扩展一下这里发生的事情。实现了ESQL