【发布时间】:2014-12-04 23:29:53
【问题描述】:
我正在将我们的系统与一些 xml 服务集成,我想知道是否有任何最佳实践来处理表示错误的响应。 例如。我有一个要求:
<FindSmthPls>
<Login>MyLogin</Login>
<Password>MyPassword</Password>
<SomeAttributes>...</SomeAttribute>
</FindSmthPls>
还有回应:
<FindSmthResponse>
<SomeResults>...</SomeResults>
</FindSmthResponse>
但是如果xml服务返回格式错误:
<Error>
<ErrorCode>1</ErrorCode>
<ErrorMessage>Sorry but we cannot find anything for your request!</ErrorMessage>
</Error>
我无法将该 xml 反序列化为 FindSmthResponse,这就是为什么我必须以下列方式处理错误:
try
{
return Deserialize<T>(xml);
}
//for the cases when I cannot deserialize response
//I can assume that service returned an error
catch (InvalidOperationException ex)
{
var error = Deserialize<TError>(xml);
throw new XmlException(error);
}
但正如您从我上面的错误响应示例中看到的,并非所有错误都是坏的,其中一些只是说没有什么可以返回。这就是为什么在我处理这个错误的地方我应该像这样添加:
catch (XmlException e)
{
//workaround for cases when service returns errors like: result is empty
if (_safeErrors.Any(c =>
c.Key.Equals(e.XmlError.Code, StringComparison.InvariantCultureIgnoreCase) &&
c.Value.Equals(e.XmlError.Message, StringComparison.InvariantCultureIgnoreCase)))
{
return null;
}
throw new XmlApiException(e);
}
在这个解决方案中至少有两个缺点:
- 我们在错误处理程序中有一些逻辑
- 我们应该将错误代码和有时的消息与“错误白名单”相匹配,这样我们就可以只返回 NULL,并且在没有任何内容可返回的情况下不抛出异常。
当然这个解决方案有效,但我真的想知道也许有一些最佳实践我们可以为单个 xml 请求处理不同的 xml 响应?
附言请注意,我正在与之集成的 XML 服务可能会返回代码 1 的错误,就像真正的异常一样:登录错误和搜索结果为空。
【问题讨论】:
-
这是一个 HTTP 服务吗?如果是这样,我宁愿依靠 HTTP 状态码来传达响应格式。
-
是的,这是个好主意,我建议所有开发人员为错误返回一个 HTTP 代码 500,但在我的情况下,服务在 XML 中返回错误,HTTP 代码为 200。