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

Web服务上的一般异常

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

    我正在与来自C的MS Dynamics GP WebServices集成,我不确定如何处理异常。

    如果我使用不精确的id执行getcustomer,web服务将返回一个“通用”soapexception,消息是“business object not found”。因此,我认为确保它是一个无效的id而不是任何其他错误的唯一方法是通过解析错误消息,我发现这个解决方案非常脆弱。我的GP版本是英文,在客户网站上是法文,我不知道Web服务消息是哪种语言。我正在考虑捕获它,解析消息并抛出一个更有意义的错误类型。

    你认为有更好的选择吗?

    5 回复  |  直到 13 年前
        1
  •  1
  •   Tom Anderson    15 年前

    不幸的是,econnect api和gp web服务都返回一般性错误,只是很高兴您不必解析econnect错误。

    好的一面是,错误通常是静态的,因此可以为它们构建解析器。使用这种类型的web服务创建自定义异常绝对是一种很好的方法。

        2
  •  1
  •   Jacob Proffitt    15 年前

    我有 a blog post 这详细说明了我是如何在wcf中克服这个问题的(尽管如您所见,我不介意通过解析错误消息来获取详细信息)。这是它的肉:

    catch (FaultException soapEx)
    {
        MessageFault mf = soapEx.CreateMessageFault();
        if (mf.HasDetail)
        {
            XmlDictionaryReader reader = mf.GetReaderAtDetailContents();
            Guid g = reader.ReadContentAsGuid();
        }
    }
    

    一旦有了guid,就可以使用它来查询gp web服务以获取错误的详细信息。

        3
  •  0
  •   Jesper Palm    15 年前

    你能控制webservice代码吗?

    在这种情况下,我将返回带有简单错误代码的soapexceptions,这些代码更易于解析,并让客户端应用程序决定基于什么消息显示以及解析的错误代码。

    您可以在webservice上使用“错误代码”枚举使代码更可读。

    //Example
    enum ErrorCodes
    {
      BusinessObjectNotFound = 1000,
      AnotherPossibleError = 1002
    }
    
    try
    {
    //Code
    }
    Catch(BusinessObjectNotFoundException bex)
    {
      throw new SoapException(ErrorCodes.BusinessObjectNotFound);
      //Or maybe...
      //throw new SoapException(((int)ErrorCodes.BusinessObjectNotFound).ToString());
    }
    
        4
  •  0
  •   pmlarocque    15 年前

    对于对这些话题感兴趣的人来说,jacob proffitt的回答看起来是个不错的选择。这里有一个来自dynamics gp文档的剪报:

    catch(SoapException soapErr)
    {
        // If a validation exception occurred, the logid will be in a child node
        if(soapErr.Detail.HasChildNodes == true)
        {
            // Create a guid for the logid value in the soap exception
            Guid guid = new Guid(soapErr.Detail.InnerText);
    
            // Get the validation result object
            validationResult = wsDynamicsGP.GetLoggedValidationResultByKey(guid, context);
    
            // Display the number of validation exceptions
            MessageBox.Show("Number of validation exceptions: " +
            validationResult.Errors.Length.ToString());
        }
    

    }

    但在我引用的例子中:getcustomer的id不存在,“soaperr.detail.haschildnodes”一行是false,所以失败了。

    webservices似乎充满了有趣的行为,这将花费比我预期的更长的时间:(。

        5
  •  0
  •   Paul    13 年前

    我开始讨厌全科医生了。这可能是“糟糕的形式”,但我做了以下几点:

    try
    {
        // query service for object by key
    }
    catch (System.ServiceModel.FaultException e)
    {
        if (e.Message == "Business object not found.")
        {
            // create new object
        }
        else
        {
            // log the exception appropriately
        }
    }