清除从Azure表中捕获错误的方法(除了字符串匹配?)

我想获得所有Azure Table错误的列表,并找出一个在try...catch块中处理它们的简洁方法。

例如,我不想直接编码并将InnerException消息与String.Contains("The specified entity already exists") 。 捕获这些错误的正确方法是什么?

替代文字

您可以尝试查看Response中的值,而不是内部exception。 这是我的一个try catch块的示例:

 try { return query.FirstOrDefault(); } catch (System.Data.Services.Client.DataServiceQueryException ex) { if (ex.Response.StatusCode == (int)System.Net.HttpStatusCode.NotFound) { return null; } throw; } 

显然这只是项目不存在错误,但我相信你可以通过查看Azure错误代码列表来扩展这个概念。

请在此处查看我的代码: http : //blog.smarx.com/posts/testing-existence-of-a-windows-azure-blob 。 该模式是捕获StorageClientException,然后使用.ErrorCode属性来匹配StorageErrorCode中的常量。

要在向表中添加对象时处理错误,可以使用以下代码:

 try { _context.AddObject(TableName, entityObject); _context.SaveCangesWithRetries(); } catch(DataServiceRequestException ex) { ex.Response.Any(r => r.StatusCode == (int)System.Net.HttpStatusCode.Conflict) throw; } 

如在其他答案中所述,您可以在以下位置找到TableStorage错误列表: http : //msdn.microsoft.com/en-us/library/dd179438.aspx

这是Azure表白皮书中提供的代码,但我不确定这是否对smark的回复有任何价值。

  /* From Azure table whitepaper When an exception occurs, you can extract the sequence number (highlighted above) of the command that caused the transaction to fail as follows: try { // ... save changes } catch (InvalidOperationException e) { DataServiceClientException dsce = e.InnerException as DataServiceClientException; int? commandIndex; string errorMessage; ParseErrorDetails(dsce, out commandIndex, out errorMessage); } */ 

  void ParseErrorDetails( DataServiceClientException e, out string errorCode, out int? commandIndex, out string errorMessage) { GetErrorInformation(e.Message, out errorCode, out errorMessage); commandIndex = null; int indexOfSeparator = errorMessage.IndexOf(':'); if (indexOfSeparator > 0) { int temp; if (Int32.TryParse(errorMessage.Substring(0, indexOfSeparator), out temp)) { commandIndex = temp; errorMessage = errorMessage.Substring(indexOfSeparator + 1); } } } void GetErrorInformation( string xmlErrorMessage, out string errorCode, out string message) { message = null; errorCode = null; XName xnErrorCode = XName.Get("code", "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"); XName xnMessage = XName.Get ( "message", "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"); using (StringReader reader = new StringReader(xmlErrorMessage)) { XDocument xDocument = null; try { xDocument = XDocument.Load(reader); } catch (XmlException) { // The XML could not be parsed. This could happen either because the connection // could not be made to the server, or if the response did not contain the // error details (for example, if the response status code was neither a failure // nor a success, but a 3XX code such as NotModified. return; } XElement errorCodeElement = xDocument.Descendants(xnErrorCode).FirstOrDefault(); if (errorCodeElement == null) { return; } errorCode = errorCodeElement.Value; XElement messageElement = xDocument.Descendants(xnMessage).FirstOrDefault(); if (messageElement != null) { message = messageElement.Value; } } }