2008-08-26 3 views
31

jQueryajax method을 사용하여 양식 데이터를 제출할 때 오류를 처리하는 가장 좋은 방법은 무엇입니까? 이 전화의 모양에 대한 예입니다jQuery.ajax()를 사용할 때 어떻게 에러를 처리하겠습니까?

등과 중복 된 사용자 이름, 중복 된 이메일 주소 이유의 수 및 ASHX에 대한 실패 할 수 있습니다 요청이 예외를 던질 기록

$.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가 statusTexterrorThrown정의되지 않은되게 것 같다.

XMLHttpRequest.responseText에는 표준 .net 오류 페이지를 구성하는 HTML이 포함되어 있습니다.

나는 responseText에서 페이지 제목을 찾고 제목을 사용하여 어떤 오류가 발생했는지 알아 냈습니다. 커스텀 에러 핸들링 페이지를 활성화 할 때 이것이 붕괴 될 것이라는 의구심이 있지만.

ashx에서 오류를 던져야합니까? 아니면 userCreation.ashx에 대한 호출에서 반환 된 데이터의 일부로 상태 코드를 반환해야합니까?이를 사용하여 수행 할 동작을 결정할 수 있습니까?
어떻게 이러한 상황을 처리합니까?

답변

16

내가 ASHX에서 오류를 던지는 경우, 또는 내가 userCreation.ashx에 호출에 의해 반환 된 데이터 의 일환으로 상태 코드를 반환해야하고 어떤 조치를 결정 이를 사용하여 가지다? 이러한 상황을 어떻게 처리합니까? ?

개인적으로 가능하면 개인적으로 서버 측에서 처리하고 사용자에게 메시지를 전달하는 것이 좋습니다. 이는 사용자에게 무슨 일이 일어 났는지 알려주는 메시지 (본질적으로 검증 메시지)를 표시하려는 시나리오에서 매우 효과적입니다.

그러나 서버에서 발생한 작업을 기반으로 작업을 수행하려면 상태 코드를 사용하고 해당 상태 코드를 기반으로 다양한 작업을 수행 할 수있는 자바 스크립트를 작성해야 할 수 있습니다. 페이지와 그것에는 XMLHttpRequest 쓰기 :

20

디버깅, 나는 보통 단지 (<div id="error"></div> 아래의 경우) : 요소를 만들

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

그런 다음 당신은 발생하는 오류의 유형을 볼 수 있습니다 및 정확하게 캡처 : 당신의 ASHX에서

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

을, 새로운 예외 (예 : "잘못된 사용자"등)을 던져 후 바로 XMLHttpRequest.responseText에서 그 구문 분석 할 수 있습니까? 나를 위해 오류가 발생했을 때 XMLHttpRequest.responseText은 표준 ASP가 아닙니다.

{ 
"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" 
} 

편집 : 인터넷 오류 페이지,이 같은 오류가 포함 된 JSON 객체의

<WebMethod()> _ 
<ScriptMethod()> _ 
+0

1 : 감사합니다 많이. –

+0

@Ismail 새로운 질문으로이 질문을하고 코드를 제공해야한다고 생각합니다. – travis

4

지금 나는이 : 내가 전화 한 함수가 이러한 특성으로 표시되어 있으므로이 될 수있다 받아들이는 대답에 관한 문제.

이 문제에 대한 추가 고려는 내가 예외를 잘못 던지고 있다는 결론에 이르게합니다. 중복 된 사용자 이름, 이메일 주소 등은 가입 과정에서 예상되는 문제이므로 예외가 아니라 단순히 오류입니다. 어떤 경우에는 예외를 throw하지 말고 오류 코드를 반환해야합니다.

이 경우 특히 양식이 표시되는 UI의 작은 부분이므로이 경우에는 irobinson's 접근 방식을 사용해야한다고 생각합니다. 이제이 솔루션을 구현했으며 표시 할 상태 및 옵션 메시지가 들어있는 xml을 반환합니다. 나는 다음의 구문을 분석하고 적절한 조치를 취할 jQuery를 사용할 수 있습니다 : -

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(); 
} 

그러나 travis' 대답은 매우 상세하고 디버깅하는 동안 완벽 할 것 또는 내가 사용자에게 예외 메시지를 표시하고 싶어합니다. 나는 확실히 JSON을받지 못하고있다. 따라서 travis가 나열한 애트리뷰트 중 하나에 속할 것이다. 내 코드에는 없기 때문이다.

은 (내가 irobinson의 답변을 받아 갈거야,하지만 upvote에 트래비스 '대답 그냥 가장 많은 표가없는 대답을 수용하는 이상한 느낌이..)

관련 문제