服務(wù)端異常是怎么回事 如何優(yōu)雅處理前端異常?
如何優(yōu)雅處理前端異常?隨著業(yè)界對(duì)用戶(hù)體驗(yàn)的重視,前端異常處理也得到了重視。像過(guò)去一樣,很少有網(wǎng)站關(guān)心你的前端是否會(huì)異常,但是現(xiàn)在更大的網(wǎng)站會(huì)收集前端異常,然后向服務(wù)器報(bào)告。。讓我們逐一看看。1. 異常
如何優(yōu)雅處理前端異常?
隨著業(yè)界對(duì)用戶(hù)體驗(yàn)的重視,前端異常處理也得到了重視。像過(guò)去一樣,很少有網(wǎng)站關(guān)心你的前端是否會(huì)異常,但是現(xiàn)在更大的網(wǎng)站會(huì)收集前端異常,然后向服務(wù)器報(bào)告。
。讓我們逐一看看。
1. 異常捕獲
每個(gè)主流開(kāi)發(fā)語(yǔ)言都使用try。。。抓住。。。捕捉異常。當(dāng)然,前端JavaScript也不例外。最簡(jiǎn)單的代碼如下:
try{…}catch(E){控制臺(tái).log(e)
]盡管我們可以嘗試。。。抓住。。。對(duì)于異常的處理,也存在一個(gè)問(wèn)題:代碼會(huì)變得越來(lái)越復(fù)雜和臃腫,這種方法只適用于片段代碼的異常捕獲,全局異常捕獲非常麻煩。
所以有更好的方法。
window.oner錯(cuò)誤它不僅提供了錯(cuò)誤代碼的行號(hào),還提供了錯(cuò)誤借用信息,對(duì)我們準(zhǔn)確定位異常非常有幫助。
2. 異常報(bào)告
當(dāng)我們捕獲前端異常時(shí),我們需要將異常報(bào)告給后端服務(wù)器。我們通常通過(guò)Ajax提交。為了降低后端壓力,我們建議如果前端異常類(lèi)似,只報(bào)告一次。
經(jīng)過(guò)以上處理,當(dāng)當(dāng)前端出現(xiàn)異常時(shí),我們可以實(shí)時(shí)通知程序員進(jìn)行檢查和修復(fù)。
服務(wù)端返回結(jié)果長(zhǎng)度為零異常是什么原因?
當(dāng)TCP握手完成三次時(shí),服務(wù)器TCP將連接放入已建立的連接隊(duì)列。此時(shí),客戶(hù)機(jī)給出rst,然后accept返回。但是,accept返回一個(gè)econnectabort錯(cuò)誤。這不是致命錯(cuò)誤。
2. 服務(wù)器進(jìn)程終止的過(guò)程如下:A.終止服務(wù)進(jìn)程。作為進(jìn)程善后處理的一部分,所有打開(kāi)的文件描述符都是關(guān)閉的,這導(dǎo)致服務(wù)器TCP(注意“server”和“servertcp”是不同的概念)向客戶(hù)端發(fā)送fin,客戶(hù)端TCP用ACK響應(yīng)。
b.客戶(hù)端正在阻止scanf功能(基于上一篇文章中提到的客戶(hù)端模型),這會(huì)導(dǎo)致客戶(hù)端不知道服務(wù)器TCP已關(guān)閉連接。
c和客戶(hù)端調(diào)用write,在scanf返回后將數(shù)據(jù)發(fā)送到服務(wù)器。由于服務(wù)端已被kill刪除,服務(wù)器端TCP向客戶(hù)端TCP發(fā)送RST。
d,客戶(hù)端在發(fā)送數(shù)據(jù)后立即調(diào)用read來(lái)讀取數(shù)據(jù)。由于FIN的第一步,read立即返回0(表示EOF),但是客戶(hù)端希望接收剛才發(fā)送的數(shù)據(jù)而不是FIN。如果客戶(hù)端隨后向服務(wù)器發(fā)送數(shù)據(jù),它將誘導(dǎo)服務(wù)器TCP向服務(wù)器發(fā)送SIGPIPE信號(hào),因?yàn)樗谙蚪邮誶st的套接字寫(xiě)入數(shù)據(jù)時(shí)將接收此信號(hào)。問(wèn)題的本質(zhì)是客戶(hù)端同時(shí)處理兩個(gè)描述符--套接字和用戶(hù)輸入,程序只在一個(gè)源上被阻塞。這個(gè)問(wèn)題可以用1來(lái)解決。設(shè)置非阻塞模式。2使用Select和epoll。
3. 在客戶(hù)端TCP發(fā)送數(shù)據(jù)之后,它將嘗試重新傳輸,直到它放棄并向客戶(hù)端進(jìn)程返回錯(cuò)誤消息。Etimeout表示沒(méi)有相應(yīng)的連接,ehostunach表示路由器確定主機(jī)不可訪問(wèn)。
4. 服務(wù)器崩潰后重新啟動(dòng)
由于服務(wù)器TCP丟失了以前的連接信息,這將導(dǎo)致服務(wù)器發(fā)送rst,此時(shí)客戶(hù)端塊在讀取函數(shù)中,這將導(dǎo)致返回econnectreset錯(cuò)誤。
5。當(dāng)服務(wù)器關(guān)閉時(shí)
init進(jìn)程將首先向所有進(jìn)程發(fā)送SIGTERM(此信號(hào)可以被捕獲),然后在一段時(shí)間后向仍在運(yùn)行的程序發(fā)送sigkill(次),這與終止服務(wù)器進(jìn)程是一樣的。