1
我正在使用一些xml服務處理我們的系統集成,我想知道是否有任何最佳實踐來處理表示錯誤的響應。 例如我有一個請求: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響應?
p.s.請注意,我正在整合的XML服務可能會返回代碼1的錯誤,例如:錯誤的登錄名和空的搜索結果。
這是一個HTTP服務?如果是這樣,我寧願依靠HTTP狀態碼來傳遞響應格式。 – 2014-12-04 15:36:01
是的,這是一個好主意,我會向所有開發人員推薦返回HTTP代碼500的錯誤,但在我的情況下,服務返回HTTP代碼爲200的XML錯誤。 – 2014-12-05 20:54:51