WebApi 異常處理解決方案

2021-07-25 15:27:34 字數 4070 閱讀 8057

public

class webapiexceptionfilterattribute : exceptionfilterattribute

else

if (actionexecutedcontext.exception is timeoutexception)

//.....這裡可以根據專案需要返回到客戶端特定的狀態碼。如果找不到相應的異常,統一返回服務端錯誤500

else

base.onexception(actionexecutedcontext);

}}

通過判斷異常的具體型別,向客戶端返回不同的http狀態碼,示例裡面寫了兩個,可以根據專案的實際情況加一些特定的我們想要捕獲的異常,然後將對應的狀態碼寫入http請求的response裡面,對於一些我們無法判斷型別的異常,統一返回服務端錯誤500。

3、http的狀態碼

#region 程式集 system.dll, v4.0.0.0

// c:\program files (x86)\reference assemblies\microsoft\framework\.netframework\v4.5\system.dll

#endregion

using system;

namespace

system.net

}http狀態碼

4、介面級別使用自定義異常篩選器

如果需要,甚至可以向status code裡面寫入自定義的描述資訊,並且還可以向我們的response的content裡面寫入我們想要的資訊。我們稍微改下onexception方法:

if (actionexecutedcontext.exception is notimplementedexception)

5、介面級別使用自定義異常篩選器

如果想要某乙個或者多個控制器裡面的所有介面都使用異常過濾,直接在控制器上面標註特性即可。

某乙個控制器上面啟用異常過濾

[webapiexceptionfilter]

public

class chargingcontroller : baseapicontroller

}

多個控制器上面同時啟用異常過濾

[webapiexceptionfilter]

public

class baseapicontroller : apicontroller

public

class chargingcontroller : baseapicontroller

}

這樣,所有繼承baseapicontroller的子類都會啟用異常過濾。

6、全域性配置使用自定義異常篩選器

如果需要對整個應用程式都啟用異常過濾,有兩種方式:

1),在global.asax全域性配置裡面新增 globalconfiguration.configuration.filters.add(new webapiexceptionfilterattribute()); 這一句,如下:

2),在webapiconfig.cs檔案的register方法裡面新增 config.filters.add(new webapiexceptionfilterattribute()); 這一句,如下:

}如果在webapiconfig.cs裡已經新增了filter,global.asax裡面就不能再新增

globalconfiguration.configuration

.filters

.add(new webapiexceptionfilterattribute());

這行**了,否則就出現了filter的重複註冊,我們自定義的過濾器會被重複呼叫兩次。

二、httpresponseexception自定義異常資訊

1、上面說的是全域性的異常捕獲以及處理方式,在某些情況下,我們希望以異常的方式向客戶端傳送相關資訊,可能就需要用到我們的httpresponseexception。比如:

的物件", id)),

}2、httpresponsemessage和httpresponseexception的區別

httpresonsemessage物件用來響應訊息幷包含狀態碼及資料內容,httpresponseexception物件用來向客戶端返回包含錯誤訊息的異常。

當呼叫 web api 服務時發生了與預期上不同的錯誤時,理當應該中止程式返回錯誤訊息,這時對於錯誤的返回就該使用 httpresponseexception,而使用 httpresponsemessage 則是代表著當客戶端傳送了乙個工作請求而 web api 正確的完成了這個工作,就能夠使用 httpresponsemessage 返回乙個 201 的訊息,所以 httpresponsemessage 與 httpresponseexception 在使用上根本的目標就是不同的,用 httpresponsemessage 去返回乙個例外錯誤也會讓程式結構難以辨別且不夠清晰。

三、返回httperror

httperror物件提供一致的方法來響應正文中返回錯誤的資訊。準確來說,httperror並不是乙個異常,只是用來包裝錯誤資訊的乙個物件。其實在某一定的程度上,httperror和httpresponsemessage使用比較相似,二者都可以向客戶端返回http狀態碼和錯誤訊息,並且都可以包含在httpresponseexception物件中發回到客戶端。但是,一般情況下,httperror只有在向客戶端返回錯誤訊息的時候才會使用,而httpresponsemessage物件既可以返回錯誤訊息,也可返回請求正確的訊息。其實關於httperror沒什麼特別好講的,我們來看乙個例子就能明白:

}假如現在在執行try裡面複雜業務邏輯的時候發生了異常,我們捕獲到了異常然後向客戶端返回httperror物件,這個物件裡面包含我們自定義的錯誤訊息,如果正常則返回httpresponsemessage物件。

四、總結

以上三種異常的處理方法,可以根據不同的場景選擇使用。

如果專案對異常處理要求並不高,只需要記錄好異常日誌即可,那麼使用異常篩選器就能夠搞定

如果專案需要對不同的異常,客戶端做不同的處理。而這個時候使用異常篩選器不能詳盡所有的異常,可能使用httpresponseexception物件是更好的選擇,定義更加精細的異常和異常描述。

對於何時使用httperror,又何時使用httpresponsemessage,可以參考上文三裡面用法。

當然實際專案中很可能以上兩種或者三種同時使用。

WebApi 異常處理解決方案

1.繼承exceptionfilterattribute類,重寫onexception方法 public class webapiexceptionfilterattribute exceptionfilterattribute string errmsg jsonconvert.serialize...

WebApi異常處理解決方案

一 使用異常篩選器捕獲所有異常 public class webapiexceptionfilterattribute exceptionfilterattribute else if actionexecutedcontext.exception is timeoutexception 這裡可以根...

Springboot異常錯誤處理解決方案詳解

1.在有模板引擎的情況下 springboot會預設找 templates error 錯誤狀態碼.html,所以我們要定製化錯誤頁面就可以到templates error下建立乙個 對應錯誤狀態碼.html html檔案,當發生此狀態碼的錯誤springboot就會來到對應的頁面。同時如果我們想讓...