كيف يمكنك التعامل مع الأخطاء عند استخدام مسج.اياكس()?

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

  •  09-06-2019
  •  | 
  •  

سؤال

عند استخدام مسج's طريقة اياكس تقديم استمارة البيانات ما هي أفضل طريقة للتعامل مع الأخطاء ؟ هذا هو مثال على ما دعوة قد تبدو مثل:

$.ajax({
    url: "userCreation.ashx",
    data: { u:userName, p:password, e:email },
    type: "POST",
    beforeSend: function(){disableSubmitButton();},
    complete: function(){enableSubmitButton();},
    error: function(xhr, statusText, errorThrown){
            // Work out what the error was and display the appropriate message
        },
    success: function(data){
            displayUserCreatedMessage();
            refreshUserList();
        }
});

الطلب قد تفشل لعدد من الأسباب, مثل تكرار اسم المستخدم مكرر عنوان البريد الإلكتروني وما إلى ذلك ، ashx هو مكتوب في رمي استثناء عندما يحدث هذا.

مشكلتي يبدو أن طريق رمي استثناء ashx يسبب statusText و errorThrown أن يكون غير معرف.

أنا يمكن الحصول على XMLHttpRequest.responseText الذي يحتوي على HTML التي تشكل المعيار .صافي خطأ في الصفحة.

أنا وجدت عنوان الصفحة في responseText و باستخدام عنوان للعمل الخطأ التي ألقيت.على الرغم من أن لدي شك في أن هذا سوف ينهار عندما تمكن خطأ مخصصة للتعامل مع صفحات.

يجب أن يكون رمي الأخطاء في ashx ، أو يجب أن يكون إرجاع رمز حالة كجزء من البيانات التي تم إرجاعها بواسطة استدعاء userCreation.ashx, ثم استخدام هذا أن تقرر ما العمل ؟
كيف يمكنك التعامل مع هذه الحالات ؟

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

المحلول

يجب أن يكون رمي الأخطاء في ashx ، أو يجب أن تكون العودة رمز الحالة كجزء من البيانات عاد قبل الدعوة إلى userCreation.ashx, ثم استخدام هذا تقرر ما العمل ؟ كيف التعامل مع هذه الحالات ؟

شخصيا, إذا كان ذلك ممكنا ، كنت تفضل التعامل مع هذا على جانب الملقم و العمل تصل رسالة إلى المستخدم هناك.هذا يعمل بشكل جيد جدا في سيناريو حيث كنت ترغب فقط في عرض رسالة للمستخدم نقول لهم ما حدث (التحقق من صحة الرسالة ، أساسا).

ومع ذلك ، إذا كنت ترغب في تنفيذ العمل بناء على ما حدث على الملقم, قد تحتاج إلى استخدام رمز الحالة وكتابة بعض جافا سكريبت لتنفيذ إجراءات مختلفة على أساس أن قانون الأحوال.

نصائح أخرى

من أجل التصحيح عادة ما خلق عنصر (في حالة أدناه: <div id="error"></div>) على الصفحة وكتابة مدعوم على ذلك:

error: function (XMLHttpRequest, textStatus, errorThrown) {
    $("#error").html(XMLHttpRequest.status + "\n<hr />" + XMLHttpRequest.responseText);
}

ثم يمكنك رؤية أنواع الأخطاء التي تحدث والقبض عليهم بشكل صحيح:

if (XMLHttpRequest.status === 404) // display some page not found error
if (XMLHttpRequest.status === 500) // display some server error

في ashx, يمكنك رمي استثناء جديد (هـ.ز "المستخدم غير صالح".... الخ) و من ثم تحليل هذا من XMLHttpRequest.responseText?بالنسبة لي عندما كنت تحصل على خطأ على XMLHttpRequest.responseText ليس القياسية Asp.Net صفحة الخطأ, إنه كائن JSON التي تحتوي على مثل هذا الخطأ:

{
"Message":"Index was out of range. Must be non-negative and less than the size of the collection.\r\n
Parameter name: index",
"StackTrace":" at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)\r\n 
at etc...",
"ExceptionType":"System.ArgumentOutOfRangeException"
}

تحرير:هذا يمكن أن يكون بسبب وظيفة ادعو يتم وضع علامة مع هذه الصفات:

<WebMethod()> _
<ScriptMethod()> _

الآن لدي مشكلة على النحو الذي الإجابة على قبول.

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

الذي يقودني إلى الاعتقاد بأن irobinson هو النهج يجب أن تأخذ في هذه الحالة, خاصة وأن الشكل هو فقط جزء صغير من واجهة المستخدم التي يتم عرضها.يجب الآن تنفيذ هذا الحل و أنا عائد xml التي تحتوي على حالة اختياري الرسالة التي سيتم عرضها.ومن ثم يمكنني استخدام مسج لتحليل ذلك واتخاذ الإجراءات المناسبة:-

success: function(data){
    var created = $("result", data).attr("success");
    if (created == "OK"){
        resetNewUserForm();
        listUsers('');
    } else {
        var errorMessage = $("result", data).attr("message");
        $("#newUserErrorMessage").text(errorMessage).show();
    }
    enableNewUserForm();
}

ومع ذلك ترافيس الجواب هو مفصل جدا من شأنه أن يكون مثاليا أثناء التصحيح أو إذا أردت عرض استثناء رسالة إلى المستخدم.أنا بالتأكيد لا تلقي سلمان العودة ، لذلك هو على الارجح واحدة من تلك الصفات التي ترافيس وقد سرد ، كما لا يكون لهم في قانون بلدي.

(أنا ذاهب إلى قبول irobinson الجواب ، ولكن upvote ترافيس الإجابة.هو فقط شعور غريب أن يتم قبول الإجابة التي لا تملك أكبر عدد من الأصوات.)

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