国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C# WebApi 異常處理解決方案

2020-01-24 00:16:56
字體:
供稿:網(wǎng)友

前言:上篇C#進(jìn)階系列――WebApi接口傳參不再困惑:傳參詳解介紹了WebApi參數(shù)的傳遞,這篇來看看WebApi里面異常的處理。關(guān)于異常處理,作為程序員的我們肯定不陌生,記得在介紹 AOP的時(shí)候,我們講過通過AOP可以統(tǒng)一截獲異常。那么在我們的WebApi里面一般是怎么處理異常的呢,今天這一篇,博主帶著大家一起來實(shí)踐下WebApi的異常處理。

為什么說是實(shí)踐?因?yàn)樵?a target="_blank" rel="external nofollow" >http://www.asp.net里面已經(jīng)明確給出WebApi的異常處理機(jī)制。光有理論還不夠,今天我們還是來試一把。通過實(shí)踐,我們可能發(fā)現(xiàn)一些更詳盡的用法。

一、使用異常篩選器捕獲所有異常

我們知道,一般情況下,WebApi作為服務(wù)使用,每次客戶端發(fā)送http請(qǐng)求到我們的WebApi服務(wù)里面,服務(wù)端得到結(jié)果輸出response到客戶端。這個(gè)過程中,一旦服務(wù)端發(fā)生異常,會(huì)統(tǒng)一向客戶端返回500的錯(cuò)誤。

 [HttpGet]    public string GetAllChargingData([FromUri]TB_CHARGING obj)    {      throw new NotImplementedException("方法不被支持");    }

我們來看看http請(qǐng)求

而有些時(shí)候,我們客戶端需要得到更加精確的錯(cuò)誤碼來判斷異常類型,怎么辦呢?

記得在介紹AOP的時(shí)候,我們介紹過MVC里面的IExceptionFilter接口,這個(gè)接口用于定義異常篩選器所需的方法,在WebApi里面,也有這么一個(gè)異常篩選器,下面我們通過一個(gè)實(shí)例來看看具體如何實(shí)現(xiàn)。

首先在App_Start里面新建一個(gè)類WebApiExceptionFilterAttribute.cs,繼承ExceptionFilterAttribute,重寫OnException方法

public class WebApiExceptionFilterAttribute : ExceptionFilterAttribute   {    //重寫基類的異常處理方法    public override void OnException(HttpActionExecutedContext actionExecutedContext)    {      //1.異常日志記錄(正式項(xiàng)目里面一般是用log4net記錄異常日志)      Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "――" +        actionExecutedContext.Exception.GetType().ToString() + ":" + actionExecutedContext.Exception.Message + "――堆棧信息:" +        actionExecutedContext.Exception.StackTrace);      //2.返回調(diào)用方具體的異常信息      if (actionExecutedContext.Exception is NotImplementedException)      {        actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);      }      else if (actionExecutedContext.Exception is TimeoutException)      {        actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.RequestTimeout);      }      //.....這里可以根據(jù)項(xiàng)目需要返回到客戶端特定的狀態(tài)碼。如果找不到相應(yīng)的異常,統(tǒng)一返回服務(wù)端錯(cuò)誤500      else      {        actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.InternalServerError);      }      base.OnException(actionExecutedContext);    }  }

代碼解析:通過判斷異常的具體類型,向客戶端返回不同的http狀態(tài)碼,示例里面寫了兩個(gè),可以根據(jù)項(xiàng)目的實(shí)際情況加一些特定的我們想要捕獲的異常,然后將對(duì)應(yīng)的狀態(tài)碼寫入http請(qǐng)求的response里面,對(duì)于一些我們無法判斷類型的異常,統(tǒng)一返回服務(wù)端錯(cuò)誤500。關(guān)于http的狀態(tài)碼,framework里面定義了一些常見的類型,我們大概看看:

#region 程序集 System.dll, v4.0.0.0// C:/Program Files (x86)/Reference Assemblies/Microsoft/Framework/.NETFramework/v4.5/System.dll#endregionusing System;namespace System.Net{  // 摘要:   //   包含為 HTTP 定義的狀態(tài)代碼的值。  public enum HttpStatusCode  {    // 摘要:     //   等效于 HTTP 狀態(tài) 100。 System.Net.HttpStatusCode.Continue 指示客戶端可能繼續(xù)其請(qǐng)求。    Continue = 100,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 101。 System.Net.HttpStatusCode.SwitchingProtocols 指示正在更改協(xié)議版本或協(xié)議。    SwitchingProtocols = 101,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 200。 System.Net.HttpStatusCode.OK 指示請(qǐng)求成功,且請(qǐng)求的信息包含在響應(yīng)中。 這是最常接收的狀態(tài)代碼。    OK = 200,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 201。 System.Net.HttpStatusCode.Created 指示請(qǐng)求導(dǎo)致在響應(yīng)被發(fā)送前創(chuàng)建新資源。    Created = 201,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 202。 System.Net.HttpStatusCode.Accepted 指示請(qǐng)求已被接受做進(jìn)一步處理。    Accepted = 202,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 203。 System.Net.HttpStatusCode.NonAuthoritativeInformation 指示返回的元信息來自緩存副本而不是原始服務(wù)器,因此可能不正確。    NonAuthoritativeInformation = 203,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 204。 System.Net.HttpStatusCode.NoContent 指示已成功處理請(qǐng)求并且響應(yīng)已被設(shè)定為無內(nèi)容。    NoContent = 204,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 205。 System.Net.HttpStatusCode.ResetContent 指示客戶端應(yīng)重置(或重新加載)當(dāng)前資源。    ResetContent = 205,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 206。 System.Net.HttpStatusCode.PartialContent 指示響應(yīng)是包括字節(jié)范圍的 GET    //   請(qǐng)求所請(qǐng)求的部分響應(yīng)。    PartialContent = 206,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 300。 System.Net.HttpStatusCode.MultipleChoices 指示請(qǐng)求的信息有多種表示形式。    //   默認(rèn)操作是將此狀態(tài)視為重定向,并遵循與此響應(yīng)關(guān)聯(lián)的 Location 標(biāo)頭的內(nèi)容。    MultipleChoices = 300,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 300。 System.Net.HttpStatusCode.Ambiguous 指示請(qǐng)求的信息有多種表示形式。 默認(rèn)操作是將此狀態(tài)視為重定向,并遵循與此響應(yīng)關(guān)聯(lián)的    //   Location 標(biāo)頭的內(nèi)容。    Ambiguous = 300,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 301。 System.Net.HttpStatusCode.MovedPermanently 指示請(qǐng)求的信息已移到 Location    //   頭中指定的 URI 處。 接收到此狀態(tài)時(shí)的默認(rèn)操作為遵循與響應(yīng)關(guān)聯(lián)的 Location 頭。    MovedPermanently = 301,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 301。 System.Net.HttpStatusCode.Moved 指示請(qǐng)求的信息已移到 Location 頭中指定的    //   URI 處。 接收到此狀態(tài)時(shí)的默認(rèn)操作為遵循與響應(yīng)關(guān)聯(lián)的 Location 頭。 原始請(qǐng)求方法為 POST 時(shí),重定向的請(qǐng)求將使用 GET 方法。    Moved = 301,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 302。 System.Net.HttpStatusCode.Found 指示請(qǐng)求的信息位于 Location 頭中指定的    //   URI 處。 接收到此狀態(tài)時(shí)的默認(rèn)操作為遵循與響應(yīng)關(guān)聯(lián)的 Location 頭。 原始請(qǐng)求方法為 POST 時(shí),重定向的請(qǐng)求將使用 GET 方法。    Found = 302,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 302。 System.Net.HttpStatusCode.Redirect 指示請(qǐng)求的信息位于 Location 頭中指定的    //   URI 處。 接收到此狀態(tài)時(shí)的默認(rèn)操作為遵循與響應(yīng)關(guān)聯(lián)的 Location 頭。 原始請(qǐng)求方法為 POST 時(shí),重定向的請(qǐng)求將使用 GET 方法。    Redirect = 302,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 303。 作為 POST 的結(jié)果,System.Net.HttpStatusCode.SeeOther 將客戶端自動(dòng)重定向到    //   Location 頭中指定的 URI。 用 GET 生成對(duì) Location 標(biāo)頭所指定的資源的請(qǐng)求。    SeeOther = 303,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 303。 作為 POST 的結(jié)果,System.Net.HttpStatusCode.RedirectMethod 將客戶端自動(dòng)重定向到    //   Location 頭中指定的 URI。 用 GET 生成對(duì) Location 標(biāo)頭所指定的資源的請(qǐng)求。    RedirectMethod = 303,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 304。 System.Net.HttpStatusCode.NotModified 指示客戶端的緩存副本是最新的。 未傳輸此資源的內(nèi)容。    NotModified = 304,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 305。 System.Net.HttpStatusCode.UseProxy 指示請(qǐng)求應(yīng)使用位于 Location 頭中指定的    //   URI 的代理服務(wù)器。    UseProxy = 305,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 306。 System.Net.HttpStatusCode.Unused 是未完全指定的 HTTP/1.1 規(guī)范的建議擴(kuò)展。    Unused = 306,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 307。 System.Net.HttpStatusCode.RedirectKeepVerb 指示請(qǐng)求信息位于 Location    //   頭中指定的 URI 處。 接收到此狀態(tài)時(shí)的默認(rèn)操作為遵循與響應(yīng)關(guān)聯(lián)的 Location 頭。 原始請(qǐng)求方法為 POST 時(shí),重定向的請(qǐng)求還將使用    //   POST 方法。    RedirectKeepVerb = 307,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 307。 System.Net.HttpStatusCode.TemporaryRedirect 指示請(qǐng)求信息位于 Location    //   頭中指定的 URI 處。 接收到此狀態(tài)時(shí)的默認(rèn)操作為遵循與響應(yīng)關(guān)聯(lián)的 Location 頭。 原始請(qǐng)求方法為 POST 時(shí),重定向的請(qǐng)求還將使用    //   POST 方法。    TemporaryRedirect = 307,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 400。 System.Net.HttpStatusCode.BadRequest 指示服務(wù)器未能識(shí)別請(qǐng)求。 如果沒有其他適用的錯(cuò)誤,或者不知道準(zhǔn)確的錯(cuò)誤或錯(cuò)誤沒有自己的錯(cuò)誤代碼,則發(fā)送    //   System.Net.HttpStatusCode.BadRequest。    BadRequest = 400,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 401。 System.Net.HttpStatusCode.Unauthorized 指示請(qǐng)求的資源要求身份驗(yàn)證。 WWW-Authenticate    //   頭包含如何執(zhí)行身份驗(yàn)證的詳細(xì)信息。    Unauthorized = 401,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 402。 保留 System.Net.HttpStatusCode.PaymentRequired 以供將來使用。    PaymentRequired = 402,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 403。 System.Net.HttpStatusCode.Forbidden 指示服務(wù)器拒絕滿足請(qǐng)求。    Forbidden = 403,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 404。 System.Net.HttpStatusCode.NotFound 指示請(qǐng)求的資源不在服務(wù)器上。    NotFound = 404,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 405。 System.Net.HttpStatusCode.MethodNotAllowed 指示請(qǐng)求的資源上不允許請(qǐng)求方法(POST    //   或 GET)。    MethodNotAllowed = 405,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 406。 System.Net.HttpStatusCode.NotAcceptable 指示客戶端已用 Accept 頭指示將不接受資源的任何可用表示形式。    NotAcceptable = 406,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 407。 System.Net.HttpStatusCode.ProxyAuthenticationRequired 指示請(qǐng)求的代理要求身份驗(yàn)證。    //   Proxy-authenticate 頭包含如何執(zhí)行身份驗(yàn)證的詳細(xì)信息。    ProxyAuthenticationRequired = 407,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 408。 System.Net.HttpStatusCode.RequestTimeout 指示客戶端沒有在服務(wù)器期望請(qǐng)求的時(shí)間內(nèi)發(fā)送請(qǐng)求。    RequestTimeout = 408,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 409。 System.Net.HttpStatusCode.Conflict 指示由于服務(wù)器上的沖突而未能執(zhí)行請(qǐng)求。    Conflict = 409,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 410。 System.Net.HttpStatusCode.Gone 指示請(qǐng)求的資源不再可用。    Gone = 410,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 411。 System.Net.HttpStatusCode.LengthRequired 指示缺少必需的 Content-length    //   頭。    LengthRequired = 411,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 412。 System.Net.HttpStatusCode.PreconditionFailed 指示為此請(qǐng)求設(shè)置的條件失敗,且無法執(zhí)行此請(qǐng)求。    //   條件是用條件請(qǐng)求標(biāo)頭(如 If-Match、If-None-Match 或 If-Unmodified-Since)設(shè)置的。    PreconditionFailed = 412,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 413。 System.Net.HttpStatusCode.RequestEntityTooLarge 指示請(qǐng)求太大,服務(wù)器無法處理。    RequestEntityTooLarge = 413,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 414。 System.Net.HttpStatusCode.RequestUriTooLong 指示 URI 太長(zhǎng)。    RequestUriTooLong = 414,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 415。 System.Net.HttpStatusCode.UnsupportedMediaType 指示請(qǐng)求是不支持的類型。    UnsupportedMediaType = 415,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 416。 System.Net.HttpStatusCode.RequestedRangeNotSatisfiable 指示無法返回從資源請(qǐng)求的數(shù)據(jù)范圍,因?yàn)榉秶拈_頭在資源的開頭之前,或因?yàn)榉秶慕Y(jié)尾在資源的結(jié)尾之后。    RequestedRangeNotSatisfiable = 416,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 417。 System.Net.HttpStatusCode.ExpectationFailed 指示服務(wù)器未能符合 Expect    //   頭中給定的預(yù)期值。    ExpectationFailed = 417,    //    UpgradeRequired = 426,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 500。 System.Net.HttpStatusCode.InternalServerError 指示服務(wù)器上發(fā)生了一般錯(cuò)誤。    InternalServerError = 500,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 501。 System.Net.HttpStatusCode.NotImplemented 指示服務(wù)器不支持請(qǐng)求的函數(shù)。    NotImplemented = 501,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 502。 System.Net.HttpStatusCode.BadGateway 指示中間代理服務(wù)器從另一代理或原始服務(wù)器接收到錯(cuò)誤響應(yīng)。    BadGateway = 502,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 503。 System.Net.HttpStatusCode.ServiceUnavailable 指示服務(wù)器暫時(shí)不可用,通常是由于過多加載或維護(hù)。    ServiceUnavailable = 503,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 504。 System.Net.HttpStatusCode.GatewayTimeout 指示中間代理服務(wù)器在等待來自另一個(gè)代理或原始服務(wù)器的響應(yīng)時(shí)已超時(shí)。    GatewayTimeout = 504,    //    // 摘要:     //   等效于 HTTP 狀態(tài) 505。 System.Net.HttpStatusCode.HttpVersionNotSupported 指示服務(wù)器不支持請(qǐng)求的    //   HTTP 版本。    HttpVersionNotSupported = 505,  }}

定義好了異常處理方法,剩下的就是如何使用了。可以根據(jù)實(shí)際情況,在不同級(jí)別使用統(tǒng)一的異常處理機(jī)制。

1、接口級(jí)別

[WebApiExceptionFilter]    [HttpGet]    public string GetAllChargingData([FromUri]TB_CHARGING obj)    {      throw new NotImplementedException("方法不被支持");    }

執(zhí)行到異常后,會(huì)先進(jìn)到OnException方法:

執(zhí)行完成之后瀏覽器查看:

如果需要,甚至可以向Status Code里面寫入自定義的描述信息,并且還可以向我們的Response的Content里面寫入我們想要的信息。我們稍微改下OnException方法:

if (actionExecutedContext.Exception is NotImplementedException)      {        var oResponse = new HttpResponseMessage(HttpStatusCode.NotImplemented);        oResponse.Content = new StringContent("方法不被支持");        oResponse.ReasonPhrase = "This Func is Not Supported";        actionExecutedContext.Response = oResponse;      }

看看ReasonPhrase描述信息

看看Response的描述信息

2、控制器級(jí)別

如果想要某一個(gè)或者多個(gè)控制器里面的所有接口都使用異常過濾,直接在控制器上面標(biāo)注特性即可。

某一個(gè)控制器上面啟用異常過濾

[WebApiExceptionFilter]  public class ChargingController : BaseApiController  {    #region Get    [HttpGet]    public string GetAllChargingData([FromUri]TB_CHARGING obj)    {      throw new NotImplementedException("方法不被支持");    }  }

多個(gè)控制器上面同時(shí)啟用異常過濾

 [WebApiExceptionFilter]  public class BaseApiController : ApiController  {  }
public class ChargingController : BaseApiController  {    #region Get    [HttpGet]    public string GetAllChargingData([FromUri]TB_CHARGING obj)    {      throw new NotImplementedException("方法不被支持");    }  }

這樣,所有繼承BaseApiController的子類都會(huì)啟用異常過濾。

3、全局配置

如果需要對(duì)整個(gè)應(yīng)用程序都啟用異常過濾,則需要做如下兩步:

1、在Global.asax全局配置里面添加GlobalConfiguration.Configuration.Filters.Add(new WebApiExceptionFilterAttribute());這一句,如下:

void Application_Start(object sender, EventArgs e)    {      // 在應(yīng)用程序啟動(dòng)時(shí)運(yùn)行的代碼      AreaRegistration.RegisterAllAreas();      GlobalConfiguration.Configure(WebApiConfig.Register);      RouteConfig.RegisterRoutes(RouteTable.Routes);      GlobalConfiguration.Configuration.Filters.Add(new WebApiExceptionFilterAttribute());    }

2、在WebApiConfig.cs文件的Register方法里面添加 config.Filters.Add(new WebApiExceptionFilterAttribute());這一句,如下:

public static void Register(HttpConfiguration config)    {      //跨域配置      config.EnableCors(new EnableCorsAttribute("*", "*", "*"));      // Web API 路由      config.MapHttpAttributeRoutes();      RouteTable.Routes.MapHttpRoute(        name: "DefaultApi",        routeTemplate: "api/{controller}/{action}/{id}",        defaults: new { id = RouteParameter.Optional }      ).RouteHandler = new SessionControllerRouteHandler();      config.Filters.Add(new WebApiExceptionFilterAttribute());    }

二、HttpResponseException自定義異常信息

上面說的是全局的異常捕獲以及處理方式,在某些情況下,我們希望以異常的方式向客戶端發(fā)送相關(guān)信息,可能就需要用到我們的HttpResponseException。比如:

[HttpGet]    public TB_CHARGING GetById(string id)    {      //從后臺(tái)查詢實(shí)體      var oModel = server.Find(id);      if (oModel == null)      {        var resp = new HttpResponseMessage(HttpStatusCode.NotFound)        {          Content = new StringContent(string.Format("沒有找到id={0}的對(duì)象", id)),          ReasonPhrase = "object is not found"        };        throw new HttpResponseException(resp);      }      return oModel;    }

執(zhí)行之后瀏覽器里面查看結(jié)果:

代碼釋疑:細(xì)心的朋友可能,發(fā)現(xiàn)了,這里既使用了HttpResponseMessage,又使用了HttpResponseException,那么,像這種可控的異常,我們是否可以直接以HttpResponseMessage的形式直接返回到客戶端而不用拋出異常呢?這里就要談?wù)勥@兩個(gè)對(duì)象的區(qū)別了,博主的理解是HttpResonseMessage對(duì)象用來響應(yīng)訊息并包含狀態(tài)碼及數(shù)據(jù)內(nèi)容,HttpResponseException對(duì)象用來向客戶端返回包含錯(cuò)誤訊息的異常。

在網(wǎng)上看到一篇文章這樣描述兩者的區(qū)別:當(dāng)呼叫 Web API 服務(wù)時(shí)發(fā)生了與預(yù)期上不同的錯(cuò)誤時(shí),理當(dāng)應(yīng)該中止程序返回錯(cuò)誤訊息,這時(shí)對(duì)于錯(cuò)誤的返回就該使用 HttpResponseException,而使用 HttpResponseMessage 則是代表著當(dāng)客戶端發(fā)送了一個(gè)工作請(qǐng)求而 Web API 正確的完成了這個(gè)工作,就能夠使用 HttpResponseMessage 返回一個(gè) 201 的訊息,所以 HttpResponseMessage 與 HttpResponseException 在使用上根本的目標(biāo)就是不同的,用 HttpResponseMessage 去返回一個(gè)例外錯(cuò)誤也會(huì)讓程序結(jié)構(gòu)難以辨別且不夠清晰。

三、返回HttpError

HttpError對(duì)象提供一致的方法來響應(yīng)正文中返回錯(cuò)誤的信息。準(zhǔn)確來說,HttpError并不是一個(gè)異常,只是用來包裝錯(cuò)誤信息的一個(gè)對(duì)象。其實(shí)在某一定的程度上,HttpError和HttpResponseMessage使用比較相似,二者都可以向客戶端返回http狀態(tài)碼和錯(cuò)誤訊息,并且都可以包含在HttpResponseException對(duì)象中發(fā)回到客戶端。但是,一般情況下,HttpError只有在向客戶端返回錯(cuò)誤訊息的時(shí)候才會(huì)使用,而HttpResponseMessage對(duì)象既可以返回錯(cuò)誤訊息,也可返回請(qǐng)求正確的消息。其實(shí)關(guān)于HttpError沒什么特別好講的,我們來看一個(gè)例子就能明白:

public HttpResponseMessage Update(dynamic obj)    {      TB_Product oModel = null;      try      {        var id = Convert.ToString(obj.id);        oModel = Newtonsoft.Json.JsonConvert.DeserializeObject<TB_Product>(Convert.ToString(obj.dataModel));        //...復(fù)雜的業(yè)務(wù)邏輯      }      catch(Exception ex)      {        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message);      }      return Request.CreateResponse<TB_Product>(HttpStatusCode.OK, oModel);    }

假如現(xiàn)在在執(zhí)行try里面復(fù)雜業(yè)務(wù)邏輯的時(shí)候發(fā)生了異常,我們捕獲到了異常然后向客戶端返回HttpError對(duì)象,這個(gè)對(duì)象里面包含我們自定義的錯(cuò)誤訊息,如果正常則返回HttpResponseMessage對(duì)象。

如果請(qǐng)求異常:

如果請(qǐng)求正常

四、總結(jié)

以上三種異常的處理方法,可以根據(jù)不同的場(chǎng)景選擇使用。

  • 如果項(xiàng)目對(duì)異常處理要求并不高,只需要記錄好異常日志即可,那么使用異常篩選器就能夠搞定
  • 如果項(xiàng)目需要對(duì)不同的異常,客戶端做不同的處理。而這個(gè)時(shí)候使用異常篩選器不能詳盡所有的異常,可能使用HttpResponseException對(duì)象是更好的選擇,定義更加精細(xì)的異常和異常描述。
  • 對(duì)于何時(shí)使用HttpError,又何時(shí)使用HttpResponseMessage,可以參考上文三里面用法。
  • 當(dāng)然實(shí)際項(xiàng)目中很可能以上兩種或者三種同時(shí)使用。

上文通過一些簡(jiǎn)單的示例介紹了下WebApi里面異常的處理機(jī)制,可能不夠深入,但對(duì)于一般項(xiàng)目的異常處理基本夠用。其實(shí)有一點(diǎn)博主還沒有想明白,對(duì)于構(gòu)造函數(shù)里面的異常該如何統(tǒng)一捕獲呢?通過異常篩選器是捕獲不到的,不知道園友們有沒有什么更好的辦法,不吝賜教,感謝感謝!如果本文能幫到你,不妨推薦下,您的推薦是博主繼續(xù)總結(jié)的動(dòng)力!也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 大悟县| 扎兰屯市| 松潘县| 万山特区| 克拉玛依市| 丽江市| 波密县| 璧山县| 开封县| 黄骅市| 九江市| 象州县| 巴马| 平原县| 神农架林区| 华亭县| 鄂托克旗| 临江市| 竹北市| 满城县| 固原市| 尼玛县| 长垣县| 阳曲县| 清涧县| 井冈山市| 淳安县| 布拖县| 遂川县| 台南县| 峨边| 闻喜县| 独山县| 越西县| 邻水| 云安县| 石门县| 庆安县| 万盛区| 长治市| 宁化县|