繁体   English   中英

例外和Web服务

[英]Exceptions and web services

我使用标准的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。

或者,如果这是一个坏主意,是否有任何建议的例外从这样的Web服务抛出?

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

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

当涉及到抛出异常时,这里有一些很好的“几乎”规则 (当然这些规则有例外):

几乎是规则#1

在决定是否应该抛出异常时,假装throw语句使计算机发出3次蜂鸣声,并且睡眠2秒钟。 如果你仍想在这种情况下投掷,那就去吧。

几乎是规则#2

如果您认为任何人想要捕获您的异常都是正常的,那么它可能根本不应该是例外。

当您将这些应用于服务请求/交换时,您会发现根据返回给调用者的异常进行思考确实没有意义。 如果呼叫者将被告知有问题,那么此时问题就没有什么特别之处,应由服务合同处理。

即使你只有一个错误合同说“请求因未知原因而失败”,客户也可以预料到这一点并成为合同的一部分。 如果您想根据需要获得更详细的信息,可能会有所帮助,具体取决于您的要求。

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

希望这有助于解释为什么您的错误不是例外,以及为什么它应该是合同的明确部分。

祝好运-

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM