2013-02-07 52 views
4

讓我們假設我有以下方法在我的HttpHandler(ashx的):爲jquery.ajax生成自定義錯誤()

private void Foo() 
{ 
    try 
    { 
     throw new Exception("blah"); 
    } 
    catch(Exception e) 
    { 
     HttpContext.Current.Response.Write(
      serializer.Serialize(new AjaxError(e))); 
    } 
} 

[Serializable] 
public class AjaxError 
{ 
    public string Message { get; set; } 
    public string InnerException { get; set; } 
    public string StackTrace { get; set; } 

    public AjaxError(Exception e) 
    { 
     if (e != null) 
     { 
      this.Message = e.Message; 
      this.StackTrace = e.StackTrace; 
      this.InnerException = e.InnerException != null ? 
       e.InnerException.Message : null; 


      HttpContext.Current.Response.StatusDescription = "CustomError"; 
     } 

    } 
} 

當我做出$.ajax()調用方法,我將結束success回調,無論後端出了什麼問題,我最終在catch塊。

我已經擴展了ajax方法來規範化錯誤處理,所以無論它是「jquery」錯誤(解析錯誤等)還是我的自定義錯誤,我都會在錯誤回調中結束。

現在,我想知道是什麼,應該怎麼加像

HttpContext.Current.Response.StatusCode = 500; 

東西jQuerys錯誤處理程序結束,或者我應該處理我

HttpContext.Current.Response.StatusDescription = "CustomError"; 

的jqXHR對象,並假設它出現錯誤?

讓我知道,如果有什麼不清楚。

+2

您應該將錯誤代碼發送到4xx或5xx系列,以使它陷入錯誤回調,HTTP代碼列表http://en.wikipedia.org/wiki/List_of_HTTP_status_codes –

+0

@Furqan你會建議哪一個?我已經看到了這個列表,但是,imo,它們都不符合我的需求。我的意思是,你真的可以將我的自定義錯誤歸類爲「內部服務器錯誤」嗎? – Johan

+2

如果它們都不匹配你的代碼,你可以發送你自己的代碼,如450,它只會讓你的電話落在錯誤處理程序中,並且你可以檢查你的自定義代碼並適當地處理。 –

回答

0

您至少需要使用狀態代碼,因爲這樣你的$就可以實現這樣的功能失效:

$.ajax({...}) 
    .fail(function(xhr) { 
     console.log(xhr.statusText); // the status text 
     console.log(xhr.statusCode); // the status code 
    }); 

如果你想只是直接將文本發送到您可以使用用戶狀態文本。您也可以根據不同的錯誤(即使狀態碼不是常規的)執行不同的狀態碼:

$.ajax({...}) 
    .fail(function(xhr) { 
     switch(xhr.statusCode) { 
      case 401: 
       // ... do something 
       break; 
      case 402: 
       // ... do something 
       break; 
      case 403: 
       // ... do something 
       break; 
     } 
    }); 
+0

這就是我最終做的:) – Johan