久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 入門指導 > arm webapi遇到異(yi)常(chang)怎么處理?詳細步驟告(gao)訴你

arm webapi遇到異常怎么(me)處理?詳細步驟(zou)告訴你 時間:2018-07-20  ;    來源:未知

我(wo)們(men)(men)都知(zhi)道,webapi是作為服務(wu)(wu)(wu)(wu)器來使用(yong)的(de)(de),每次客(ke)戶端發送http請求(qiu)到我(wo)們(men)(men)的(de)(de)WebApi服務(wu)(wu)(wu)(wu)里面(mian),那么服務(wu)(wu)(wu)(wu)器就(jiu)(jiu)會把結果(guo)輸到response到客(ke)戶端,在(zai)這(zhe)(zhe)個步(bu)驟中,如果(guo)服務(wu)(wu)(wu)(wu)器發生異(yi)(yi)常,那么就(jiu)(jiu)會返回500的(de)(de)錯誤,那么在(zai)這(zhe)(zhe)個時候我(wo)們(men)(men)應該如何來處理這(zhe)(zhe)樣的(de)(de)異(yi)(yi)常呢,在(zai)這(zhe)(zhe)里給你(ni)們(men)(men)提(ti)供一些(xie)處理異(yi)(yi)常的(de)(de)小(xiao)技巧。

通常(chang)webapi會出(chu)現的異(yi)(yi)常(chang)一般有下面(mian)幾點:Controller構造(zao)方法中出(chu)現的異(yi)(yi)常(chang), MessageHandlers中出(chu)現的異(yi)(yi)常(chang),路由過程(cheng)(cheng)中出(chu)現的異(yi)(yi)常(chang),Body在序列化/反序列化過程(cheng)(cheng)中出(chu)現的異(yi)(yi)常(chang)

由(you)于ExceptionFilter解決不了(le)這些異常(chang),那(nei)么為(wei)了(le)解決這些問題,webapi還有兩個(ge)針對異常(chang)記錄、處理的(de)擴展點:那(nei)就是IExceptionLogger 和(he)IExceptionHandler。

對(dui)于這兩個(ge)來(lai)說,他們是(shi)(shi)webapi管道組件進行(xing)注冊管理(li)的,他們是(shi)(shi)有(you)不同(tong)分工的。

IExceptionHandler作(zuo)為異(yi)常(chang)(chang)處(chu)(chu)理組件,負責異(yi)常(chang)(chang)發(fa)生(sheng)后(hou)的(de)(de)處(chu)(chu)理工作(zuo),他處(chu)(chu)于(yu)異(yi)常(chang)(chang)處(chu)(chu)理管道的(de)(de)最(zui)末端,當IExceptionLogger組件進(jin)(jin)行(xing)一(yi)場記錄完畢、沒有(you)(you)相關的(de)(de)ExceptoinFilter進(jin)(jin)行(xing)異(yi)常(chang)(chang)處(chu)(chu)理時,才會(hui)最(zui)終調用(yong)ExceptionHandler進(jin)(jin)行(xing)異(yi)常(chang)(chang)處(chu)(chu)理,在(zai)Web API中,有(you)(you)且僅有(you)(you)一(yi)個ExceptionHandler進(jin)(jin)行(xing)異(yi)常(chang)(chang)的(de)(de)處(chu)(chu)理。

arm webapi

IExceptionLogger作為異(yi)(yi)常(chang)(chang)日(ri)志記錄組(zu)件(jian),負(fu)(fu)責異(yi)(yi)常(chang)(chang)發生(sheng)后的(de)日(ri)志記錄,他貫穿于整個(ge)Web API的(de)生(sheng)命周期(qi)中(zhong),在(zai)Web API框(kuang)架(jia)里,任何(he)一(yi)個(ge)請求周期(qi)中(zhong)出現任何(he)一(yi)個(ge)未被捕獲/處(chu)理的(de)異(yi)(yi)常(chang)(chang)都會首先(xian)進入(ru)這個(ge)異(yi)(yi)常(chang)(chang)日(ri)志記錄管道進行異(yi)(yi)常(chang)(chang)Log記錄,在(zai)Web API中(zhong)可以(yi)注冊多個(ge)IExceptionLogger實例負(fu)(fu)責不同的(de)異(yi)(yi)常(chang)(chang)處(chu)理。

在(zai)Web API框架(jia)中(zhong)給出(chu)了兩(liang)個(ge)基(ji)類(lei):ExceptionLogger和(he)ExceptionHandler,我(wo)們在(zai)使用(yong)(yong)ExceptionLogger基(ji)類(lei)時,他(ta)提(ti)供了ShouldLog虛方法,該方法在(zai)基(ji)類(lei)中(zhong)被(bei)調(diao)用(yong)(yong),其作用(yong)(yong)在(zai)于避免同(tong)(tong)一(yi)個(ge)異(yi)常被(bei)同(tong)(tong)一(yi)個(ge)ExceptionLogger實(shi)例重(zhong)復(fu)記錄(lu)(如當后(hou)續的管(guan)道中(zhong)該異(yi)常又被(bei)拋出(chu),或(huo)者同(tong)(tong)一(yi)個(ge)ExceptionLogger對(dui)象不小心被(bei)注(zhu)冊(ce)了兩(liang)次就會出(chu)現重(zhong)復(fu)記錄(lu)的可能(neng))我(wo)們也能(neng)復(fu)寫ShouldLog方法加(jia)入(ru)我(wo)們自己的異(yi)常記錄(lu)判斷(duan)邏輯以(yi)(yi)針(zhen)對(dui)不同(tong)(tong)的場景進行不同(tong)(tong)的ExceptionLogger調(diao)用(yong)(yong)。如果有興趣可以(yi)(yi)反編(bian)譯(yi)一(yi)下(xia)ExceptionLogger基(ji)類(lei)看看,他(ta)使用(yong)(yong)了顯示(shi)接口實(shi)現,挺(ting)有意思的一(yi)個(ge)技巧。下(xia)面(mian)我(wo)們來(lai)看一(yi)個(ge)ExceptionLogger使用(yong)(yong)的例子:

public class ErroLogger : ExceptionLogger

{

public async Task LogAsync(ExceptionLoggerContext context, CancellationToken cancellationToken)

{

var sb = new StringBuilder();

//獲取Log組件

ILogger log = LogManager.GetCurrentClassLogger();

var request = context.Request;

sb.AppendLine("URL:");

//獲取(qu)URL

var url = request.RequestUri.ToString();

sb.AppendLine(url);

log.Error(context.Exception,sb.ToString(),"");

}

public override bool ShouldLog(ExceptionLoggerContext context)

{

return context.Exception is DemoException && base.ShouldLog(context);

}

}

在這里,我們重(zhong)新(xin)寫了(le)ShouldLog,就是(shi)為了(le)保證ExceptionLogger只記錄DemoException這個類型的異(yi)常(chang),而且他也調用了(le)基類的方法不會重(zhong)復記錄同(tong)一個異(yi)常(chang)。在LogAsync方法中,我通過Log組件記錄了(le)導致異(yi)常(chang)的請(qing)求URL,也記錄了(le)異(yi)常(chang)信息。

那接下來(lai)(lai)我們(men)就是要開始(shi)對(dui)組(zu)件來(lai)(lai)注冊了:

在(zai)App_Start/WebApiConfig.cs文件中(zhong)的Register方法中(zhong)寫入

config.Services.Add(typeof(IExceptionLogger),new ErroLogger());

這(zhe)樣,針對DemoException的異(yi)常記錄組件(jian)就完成了,當Web API執(zhi)行管(guan)道中出現未(wei)處理的DemoException異(yi)常,均(jun)會調(diao)用(yong)則個(ge)組件(jian)進行記錄。

接下來我們來寫(xie)一個(ge)(ge)ExceptionHandler,在整個(ge)(ge)Web API框架中(zhong),ExceptionHandler只能提(ti)供(gong)(gong)一個(ge)(ge)實例,與ExceptionLogger一樣,我們可以繼承ExceptionHandler基類來簡化(hua)異常(chang)處(chu)理,在ExceptionHandler中(zhong)也提(ti)供(gong)(gong)了(le)ShouldHandle方(fang)法來判(pan)斷該異常(chang)是否應該處(chu)理,避免重復處(chu)理管道中(zhong)其他(ta)環節(jie)重復拋(pao)出的異常(chang)。我們也同樣提(ti)供(gong)(gong)一個(ge)(ge)例子(zi):

public class ErrorHandler : ExceptionHandler

{

public override async Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken)

{

if (context.Exception is DemoException)

{

context.Result = new ResponseMessageResult(context.Request.CreateResponse(HttpStatusCode.BadRequest,new {Message=context.Exception.Message}));

}

else

{

context.Result = new ResponseMessageResult(context.Request.CreateResponse(HttpStatusCode.InternalServerError,new {Message = "服務器(qi)已被外星人綁架"}));

}

}

}

在這個例(li)子中,我們判(pan)斷了異常的類型,并根據不同(tong)(tong)的異常返回(hui)客戶(hu)端不同(tong)(tong)的響應內容(rong)和不同(tong)(tong)的HTTP狀態碼(ma)。

然后在(zai)配置中注(zhu)冊(ce)這個異常處(chu)理模塊,在(zai)App_Start/WebApiConfig.cs文件中的Register方法中寫入

config.Services.Replace(typeof(IExceptionHandler),new ErrorHandler());

這樣就替換了系統默認的ExceptionHandler,可以使(shi)用(yong)我們自(zi)定義的Handler進行(xing)異常的處理了。

在異(yi)常(chang)記錄、處理過(guo)程(cheng)中,我(wo)們都碰(peng)到(dao)相應(ying)的(de)異(yi)常(chang)上下(xia)文(wen)參(can)數,我(wo)們能通過(guo)這個參(can)數獲(huo)取當前請求的(de)上下(xia)文(wen),獲(huo)取請求、響應(ying)(小心有時會(hui)為空哦)、捕獲(huo)到(dao)該異(yi)常(chang)的(de)catch塊信(xin)息等內容(rong),我(wo)們可(ke)以利用這些信(xin)息更好地描(miao)述、記錄、處理異(yi)常(chang)。

到這里ExceptionLogger組件和ExceptionHandler組件簡單的(de)開(kai)發就完成了(le)。在(zai)開(kai)發的(de)過(guo)程(cheng)中我們可以看(kan)到,ExceptionLogger負責了(le)全局的(de)異常(chang)記(ji)(ji)錄,在(zai)Web API框架管(guan)道下出現未處理的(de)異常(chang)ExceptionLogger都(dou)會(hui)進行捕獲、記(ji)(ji)錄。而(er)ExceptionHandler和ExceptionFilter功能(neng)是有重疊(die)的(de),那么問(wen)題來了(le),如何使用(yong)這兩(liang)個呢?下面讓你清(qing)楚的(de)了(le)解:

arm webapi

現在你是否已經get到(dao)這(zhe)些小(xiao)竅門,小(xiao)方(fang)法了嗎,要(yao)多加練習,在出現異常時,要(yao)想到(dao)這(zhe)些對于ExceptionHandler和ExceptionFilter而言(yan),我(wo)覺得ExceptionHandler比ExceptionFilter更有優(you)勢(shi)。

上一篇:分分鐘讓你了解嵌入式軟件系統的構成

下一篇:5個嵌入式系統的例子,都超級給力

熱點(dian)文章推薦
華清學員就業榜(bang)單
高薪學(xue)員經(jing)驗分享(xiang)
熱點新(xin)聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校(xiao)合作(zuo)洽(qia)談專線(xian):010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部