طريقة نظيفة لالتقاط الأخطاء من جدول Azure (بخلاف تطابق السلسلة؟)

StackOverflow https://stackoverflow.com/questions/3739144

سؤال

أرغب في الحصول على قائمة بجميع أخطاء جدول Azure ومعرفة طريقة نظيفة للتعامل معها في أ try...catch الكتلة.

على سبيل المثال ، أود ألا أضطر إلى الترميز مباشرة ومقارنة رسالة innerexception String.Contains("The specified entity already exists"). ما هي الطريقة الصحيحة لفخ هذه الأخطاء؟

alt text

هل كانت مفيدة؟

المحلول 4

فيما يلي الرمز المقدم في Azure Table Whitepaper, ، لكنني لست متأكدًا مما إذا كان هذا يعطي أي قيمة على رد 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;
            }
        }
    }

نصائح أخرى

يمكنك محاولة النظر إلى القيم في الاستجابة ، بدلاً من الاستثناء الداخلي. هذا مثال على إحدى كتل جربتي:

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

من الواضح أن هذا فقط بالنسبة للعنصر غير موجود ، لكنني متأكد من أنه يمكنك التوسع في هذا المفهوم من خلال النظر إلى قائمة رموز خطأ Azure.

للتعامل مع الأخطاء أثناء إضافة كائنات إلى جدول ، يمكنك استخدام الكود التالي:

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

انظر الكود الخاص بي هنا: http://blog.smarx.com/posts/testing-existence-of-awindows-azure-lob. النمط هو التقاط storageClientException ، ثم استخدام خاصية .RrorCode لتتناسب مع الثوابت في StorageerRorCode.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top