代码之家  ›  专栏  ›  技术社区  ›  anon

例外和Web服务

  •  3
  • anon  · 技术社区  · 15 年前

    IM使用Java6(JavaX.jW.*)装运的标准JavaWS实现。

    我有以下几点:

    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。

    或者,如果这是一个坏主意,有没有建议从这样的WebService抛出异常?

    1 回复  |  直到 14 年前
        1
  •  4
  •   Schildmeijer    14 年前

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

    这个 正常控制 服务流程应该处理故障情况…错误不一定是例外。

    当涉及到抛出异常时,这里有一些 great "almost" rules for exceptions (当然,这些规则有例外情况):

    几乎规则α1

    当你决定是否应该投 例外,假装 语句使计算机发出嘟嘟声3 几次,然后睡两秒钟。如果 你还是想扔在那些下面 环境,去争取吧。

    几乎规则α2

    如果你认为一切正常的话 任何想抓住你的 例外,那么它可能不应该 一点也不例外。

    当您将这些应用于服务请求/交换时,您会发现,就返回给调用者的异常情况进行思考是没有意义的。如果有人要告诉调用者一个问题,那么在这一点上没有真正异常的问题,应该由服务合同来处理。

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

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

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

    祝好运