gpt4 book ai didi

java - 异常和网络服务

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:37 25 4
gpt4 key购买 nike

我使用的是标准的 java ws 实现,例如java6 (javax.jws.*).

我有以下内容:

import javax.jws.*;


@WebService(name="Widget")
public interface Widget {
@WebMethod
public @WebResult String getGadget(@WebParam(name = "id") long id) throw MyOwnException;
}

这可能吗?我是否必须使用例如 @WebFault 注释来注释 MyOwnException?在我最初的测试中,我还注意到,在客户端,自动生成的 MyOwnException 被重命名为 MyOwnException_Exception 并包装了“原始”MyOwnException。

或者,如果这是一个坏主意,是否有任何建议的异常可以从这样的网络服务中抛出?

最佳答案

不要依赖跨服务边界自动生成的异常!请使用您正在考虑的 @WebFault 注释。如果客户需要处理它,那也没什么特别的。让它成为你的数据契约(Fault Contract)的一部分。 Google“SOAP fault element”有教程和其他文章解释如何以及为什么。

服务中的正常控制流程应该处理故障情况……故障不一定是异常的。

当谈到抛出异常时,这里有一些 great "almost" rules for exceptions (当然这些规则也有异常(exception)):

Almost Rule #1

When deciding if you should throw an exception, pretend that the throw statement makes the computer beep 3 times, and sleep for 2 seconds. If you still want to throw under those circumstances, go for it.

Almost Rule #2

If you think it will be at all normal for anyone to want to catch your exception, then probably it shouldn't be an exception at all.

当您将这些应用到服务请求/交换时,您会发现考虑将异常返回给调用者确实没有意义。如果调用者将被告知一个问题,那么此时的问题并没有什么真正的异常,它应该由服务契约来处理。

即使您只有一个故障契约(Contract),上面写着“请求因未知原因而失败”,客户也可以预料到这一点,并且它成为契约(Contract)的一部分。如果您想根据需要获得更详细的信息,这可能会有所帮助,具体取决于您的要求。

想想 REST 服务架构。 Http 返回一些预定义的错误代码。有足够多的不同错误类别,客户端可以针对每个错误类别采取适当的操作...放弃因为资源(页面)永久消失,重定向因为页面已经移动,重试因为存在内部服务器错误,处理用户所需的权限等。作为一般的 http 客户端,您不会期望看到内部语言异常返回并且对您来说意味着什么。在现有的 http 服务实现中有几十种语言和数千种潜在的异常。这就是为什么他们不是契约(Contract)的一部分。

希望这有助于解释为什么您的错误并非异常(exception),以及为什么应该将其作为契约(Contract)的明确部分。

祝你好运

关于java - 异常和网络服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1270309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com