2012-04-20 3 views
4

예상 오류는 내가 코드에서 예상하거나 심지어 제기 한 서버의 오류입니다. 예를 들어 사용자가 충분한 권한이없는 작업을 수행하려고하면 오류를 설명하는 메시지와 함께 PermissionError (사용자 지정 Exception)을 발생시킵니다.AJAX에서 예상 오류를 처리하는 방법 (사용자에게 공개하는 것을 포함)

저는 AJAX 상황에서 예상되는 오류를 처리 할 수있는 좋은 방법을 찾고 있습니다. 유일한 요구 사항은 오류 메시지를 사용자에게 표시 할 수 있도록하는 것입니다. 사용자의 상황을 계속 유지하려고합니다.

내 현재의 접근 방식은 JSON 객체로 오류 메시지를 포장하고 클라이언트 엔드 나는 확실하지 않다 마음에 다른 접근 방식을 가지고

var ajaxResponse = $.ajax({ 
    ....   
}); 

ajaxResponse.done(function(jsonObj) { 
    if (jsonObj.success) { 
     /* no error, do something */  
    } 
    else { 
     /* expected error returned, display jsonObj.error to user */ 
    } 
}); 

ajaxResponse.fail(function(jqXHR, textStatus, errorThrown) { 
    /* unexpected error returned */ 
}); 

로 다시 보내된다. 기본적으로 예상되는 오류 메시지를 JSON 객체에 패키징하는 대신 내 장고 코드에서 HttpResponse(content="no sufficient privilege", status=403)을 반환합니다. 클라이언트 측 jQuery는 다음과 같이 수정 될 것입니다 :

ajaxResponse.done(function(response_data) { 
    /* no error, do something */ 
}); 

ajaxResponse.fail(function(jqXHR, textStatus, errorThrown) { 
    /* both expected and unexpected error would end up here. 
    * It's an expected error when error code is 403 and 
    * jqXHR.responseText would give me the error message to 
    * display to the user. 
    */ 
}); 

나는 두 번째 방법이 모든 오류를 한 곳에서 예상하거나 예상치 못한 방식으로 분류하는 것을 좋아합니다. 그러나 그런 다음 http 상태 코드를이 방법으로 사용해서는 안된다는 느낌이 들었습니다. 어쨌든, 어느 것이 올바른 길인지 알고 싶습니다. 둘 다 아니라면 무엇을 할 것인지 알려주십시오.

+0

. "하지만, 내가 HTTP 상태 코드는이 방법을 사용하지 않아야 느낌이"- –

+0

@AnthonyGrist - T.J.와 동일한 관점을 공유합니다. Crowder. 여기 그가 [다른 SO 게시물] (http://stackoverflow.com/a/6701385/338961)에서 말해야만했던 것이 있습니다. – tamakisquare

답변

0

개인적으로 항상 접근 방식 1을 사용합니다. 특히 HTTP 오류 코드보다 많은 오류 조건이 있기 때문입니다. 또한 두 번째 접근법을 사용할 경우 js 코드가 예상 된 오류와 예기치 않은 오류를 구분할 수없는 경우가있을 수 있습니다.

+0

예상 오류와 예기치 않은 오류를 구별하기 위해 상태 코드 403을 사용할 수 있다고 생각합니다. 의도적으로 실행하지 않으면 403 응답이 전송 될 것이라고 생각하지 마십시오. – tamakisquare

1

jqXHR 개체에는 실패한 응답에 대한 모든 정보가 들어 있습니다. 먼저 내가 당신이 요청을 할 방법을 단순화 할 수 있습니다 :

$.ajax({ 
     url: '/the/posting/url', 
     type: 'POST', 
     data: { param: value, param_two: value_two}, 
     success: function(){ 
      alert('Everything went as is supposed to be.'); 
     }, 
     error: function(jqXHR, t, e){ 
      console.log(jqXHR.responseText); 
     } 
    }) 

그래서,이 방법은 당신이 요청이 좋은인지 아닌지 당신이 원하는 무엇을 관리 할 수 ​​있습니다.

console.log(jqXHR.responseText); 

해당 속성이 (뭔가 잘못되면 당신은 추적을 넣어하는 방법에 따라) 당신에게 자세한 오류를 알 수 있기 때문입니다 : 그럼 당신은 내가 좋아하는 뭔가를 썼다 참조하십시오. Firebug (Firefox) 또는 개발자 도구 (Chrome 및 Safari)의 콘솔에서 읽을 수 있습니다.

django (나는)가 오류를 그대로 보내고 오류 때문에 뭔가 잘못되었다는 것을 알기 위해 json에 객체를 직렬화 할 필요가 없습니다. 따라서 jquery가 뭔가 잘못되었다는 것을 알게되면 ajax 객체에 대한 error 속성이 실행되고 그 것이고 콘솔에서 읽을 수 있습니다.

$.ajaxSetup({ 

    error: function(xhr){ 
     /* Do something with xhr.responseText */ 
     window.status='Your error message goes here'; 
    } 

}); 
+3

FYI. Deprecation Notice : jqXHR.success(), jqXHR.error() 및 jqXHR.complete() 콜백은 jQuery 1.8에서 더 이상 사용되지 않습니다. 최종 제거를위한 코드를 준비하려면 대신 jqXHR.done(), jqXHR.fail() 및 jqXHR.always()를 사용하십시오. – tamakisquare

2

는이 같은 글로벌 구성을 가지고 왜 안돼? 요청을 처리하는 중에 오류가 있음을 나타내는 것은 ** 정확히 ** 어떤 상태 코드를 사용해야하는지입니다.
+0

그건 내가 찾고있는 대답이 아니야. 오류 메시지를 표시하는 방법 및/또는 위치에 대한 내 관심사가 아닙니다. 예상 된 서버 오류를 사용자에게 표시 할 수 있도록 체계적이고 일관된 방법을 찾고 있습니다. – tamakisquare

+0

@ahmoo : 어떻게 내 취향이야. "구조"는 응용 프로그램에서 한 곳에서 오류 처리를 설정하는 것입니다. 그러므로'ajaxSetup()'을 사용합니다. –

관련 문제