亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

從JavaScript到Python之異常

xcold / 3328人閱讀

摘要:但如果忽視異常輕則影響功能運(yùn)行,重則導(dǎo)致系統(tǒng)崩潰,造成經(jīng)濟(jì)損失。異常處理捕獲異常捕獲關(guān)鍵字與一致,都是使用。語(yǔ)句塊表示無(wú)論是否發(fā)生異常,語(yǔ)句塊代碼一定會(huì)被執(zhí)行。

不少前端工程師看到這個(gè)標(biāo)題可能會(huì)產(chǎn)生質(zhì)問(wèn):

我js用得好好的,能后端能APP,為什么還要學(xué)習(xí)Python?

至少有下面兩個(gè)理由:

學(xué)習(xí)曲線。ES6之后的JavaScript(TypeScript)的在語(yǔ)法上和Python有很多異曲同工的地方,所以學(xué)習(xí)曲線非常平滑,上手難度很低。

應(yīng)用場(chǎng)景。JavaScript雖然是web開(kāi)發(fā)的王者,但是其在某些方面還是存在一些問(wèn)題的。比如Node.js雖然可以寫(xiě)后端,但大多用于CGI層,做接口整合和模板渲染,而Python、Java這類語(yǔ)言已被廣泛應(yīng)用于后端服務(wù)編寫(xiě),同時(shí)Python在做機(jī)器學(xué)習(xí)等方面也很有優(yōu)勢(shì)。

這篇文章我們通過(guò)對(duì)比兩種語(yǔ)言之間的“異?!眮?lái)學(xué)習(xí)Python。

為什么需要對(duì)異常進(jìn)行處理

異常是編寫(xiě)代碼時(shí)必須考慮的問(wèn)題,但卻并不是一個(gè)熱門話題,少有文章提到。
尤其在web前端這一塊,瀏覽器的強(qiáng)大容錯(cuò)能力幫工程師解決(隱藏)了大量的異常。
但如果忽視異常輕則影響功能運(yùn)行,重則導(dǎo)致系統(tǒng)崩潰,造成經(jīng)濟(jì)損失。

異常處理 捕獲

JavaScript 異常捕獲關(guān)鍵字與 Python 一致,都是使用try。

// JavaScript
try {
  ...
}
# Python
try:
  ...

但是兩者都具有局限性:只能用來(lái)捕獲同步執(zhí)行代碼的異常。

對(duì)于異步代碼的異常捕獲的情況 JavaScript 處理起來(lái)相對(duì)復(fù)雜,按運(yùn)行環(huán)境就可以分為 Node.js 和 瀏覽器,按捕獲范圍又可以分為全部捕獲和局部捕獲。

// 瀏覽器全局異常捕獲
window.onError = e => {}  
window.addEventListener("", e => {}) 捕獲請(qǐng)求錯(cuò)誤
// 瀏覽器Ajax異常捕獲
var xhr = new XMLHttpRequest();
xhr.onload = function(e) { 
  if(this.status > 400){
    ...
  }
};
// Node.js 全局異常捕獲
process.on("uncaughtException", e => {})
// Node.js 回調(diào)方式異常捕獲
fs.readFile("/etc/passwd", (err, data) => {
  if (err) {
    ...
  }
});

Python 的情況要簡(jiǎn)單很多,即使使用異步線程或進(jìn)程,也可以在函數(shù)內(nèi)部進(jìn)行捕獲,然后其它方式上報(bào)。

def _parse_speed(key_name, speed_list):
  try:
    ...

t = threading.Thread(target=_parse_speed, args=(v, speed_list))
t.start()

由于異常捕獲情況比較復(fù)雜,如無(wú)特殊說(shuō)明,后文討論僅指使用try關(guān)鍵字的同步異常捕獲。

處理

再看看JavaScript幾種處理異常方式。

catch。catch 語(yǔ)句塊用來(lái)處理異常,處理方式也相當(dāng)粗放,try 語(yǔ)句塊內(nèi)的所有異常都會(huì)被捕獲。

finally。finally 語(yǔ)句塊表示無(wú)論是否發(fā)生異常,語(yǔ)句塊代碼一定會(huì)被執(zhí)行。

不少讀者可能會(huì)以為在catch語(yǔ)句塊后執(zhí)行的代碼和finally語(yǔ)句塊作用一樣,但其實(shí)是有區(qū)別的!

下面舉個(gè)例子

fn = () => {
  try {
    throw Error()
  } catch(e) {
    throw Error()
    return 1
  } finally {
    return 2
  }
  return 3
}
fn() // 是2不是3

也就是說(shuō) finally 語(yǔ)句塊中的代碼,不論 try 還是 catch 執(zhí)行出錯(cuò)都會(huì)執(zhí)行。

Python的異常處理:

except??梢灾付ㄐ枰幚淼亩鄠€(gè)異常類型,可以有多個(gè)異常處理邏輯,寫(xiě)法非常靈活。

else。else 語(yǔ)句塊可以當(dāng) try 語(yǔ)句塊未發(fā)生異常時(shí)執(zhí)行。

finally。特性同 JavaScript。

下面列舉使用 except 的幾個(gè)例子:

# 捕獲異常實(shí)例
except Exception as e:

# 批量異常捕獲
except (IOError, TypeError):

# 異常分類捕獲:
except OSError as err:
  ...
except ValueError:
  ...
except:
  ...
拋出

JavaScript 中可以通過(guò)關(guān)鍵字 throw 來(lái)拋出一個(gè) Error 對(duì)象。
Python中與之對(duì)應(yīng)的是 raise ,用來(lái)拋出一個(gè) Exception 實(shí)例。

雖然關(guān)鍵字不一樣但是寫(xiě)法基本相似:

// JavaScript
throw Error(...)
# Python
raise Exception(...)
異常類型

對(duì)于 JavaScript 而言,談異常類的意義不大,處理不同的異常需要手動(dòng)判斷,所以異常類型也比較簡(jiǎn)單。

Python的異常類型則豐富得多

總結(jié)

捕獲方面,JavaScript 的場(chǎng)景要比 Python 復(fù)雜,遷移學(xué)習(xí) Python 很簡(jiǎn)單。

處理方面,兩者都支持 finally 關(guān)鍵字。不同的是JavaScript 的操作被簡(jiǎn)化,只能通過(guò)一個(gè) catch 語(yǔ)句塊來(lái)處理所有類型異常。而 Python 的做法和大多數(shù)高級(jí)語(yǔ)言一致,能多次、針對(duì)不同異常進(jìn)行分別處理,else 關(guān)鍵字算是一個(gè)特色功能。

拋出方面,兩者只是關(guān)鍵字不同。

參考:

《如何優(yōu)雅處理前端異常?》

《Python異常捕獲與處理》

《Python 異常處理》

Python錯(cuò)誤和異常

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/106283.html

相關(guān)文章

  • 爬蟲(chóng) + 自動(dòng)化利器 selenium 自學(xué)成才篇(二)

    摘要:耗時(shí)代碼運(yùn)行到這句之后觸發(fā)隱式等待,在輪詢檢查后仍然沒(méi)有定位到元素,拋出異常。耗時(shí)值得一提的是,對(duì)于定位不到元素的時(shí)候,從耗時(shí)方面隱式等待和強(qiáng)制等待沒(méi)什么區(qū)別。 ...

    AWang 評(píng)論0 收藏0
  • 爬蟲(chóng)初級(jí)操作(一)

    摘要:一個(gè)對(duì)應(yīng)相應(yīng)的狀態(tài)碼,狀態(tài)碼表示協(xié)議所返回的響應(yīng)的狀態(tài)。下面將狀態(tài)碼歸結(jié)如下繼續(xù)客戶端應(yīng)當(dāng)繼續(xù)發(fā)送請(qǐng)求。繼續(xù)處理由擴(kuò)展的狀態(tài)碼,代表處理將被繼續(xù)執(zhí)行。處理方式丟棄該狀態(tài)碼不被的應(yīng)用程序直接使用,只是作為類型回應(yīng)的默認(rèn)解釋。 本篇內(nèi)容為 python 網(wǎng)絡(luò)爬蟲(chóng)初級(jí)操作,內(nèi)容主要有以下 3 部分: python 關(guān)于爬蟲(chóng)的一些基本操作和知識(shí) 靜態(tài)網(wǎng)頁(yè)抓取 動(dòng)態(tài)網(wǎng)頁(yè)抓取 基本操作和知識(shí)...

    Ocean 評(píng)論0 收藏0
  • Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---37、動(dòng)態(tài)渲染頁(yè)面抓取:Selenium

    摘要:不過(guò)動(dòng)態(tài)渲染的頁(yè)面不止這一種。再有淘寶這種頁(yè)面,它即使是獲取的數(shù)據(jù),但是其接口含有很多加密參數(shù),我們難以直接找出其規(guī)律,也很難直接分析來(lái)抓取。我們用一個(gè)實(shí)例來(lái)感受一下在這里們依然是先打開(kāi)知乎頁(yè)面,然后獲取提問(wèn)按鈕這個(gè)節(jié)點(diǎn),再將其 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---36、分析Ajax爬取今日頭條街拍美圖下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---38、動(dòng)態(tài)渲染頁(yè)面抓取:Spla...

    zhjx922 評(píng)論0 收藏0
  • Python有什么好學(xué)的》上下文管理器

    摘要:引上下文管理器太極生兩儀,兩儀為陰陽(yáng)。而最常用的則是,即上下文管理器使用上下文管理器用之后的文件讀寫(xiě)會(huì)變成我們看到用了之后,代碼沒(méi)有了創(chuàng)建,也沒(méi)有了釋放。實(shí)現(xiàn)上下文管理器我們先感性地對(duì)進(jìn)行猜測(cè)?,F(xiàn)實(shí)一個(gè)上下文管理器就是這么簡(jiǎn)單。 Python有什么好學(xué)的這句話可不是反問(wèn)句,而是問(wèn)句哦。 主要是煎魚(yú)覺(jué)得太多的人覺(jué)得Python的語(yǔ)法較為簡(jiǎn)單,寫(xiě)出來(lái)的代碼只要符合邏輯,不需要太多的學(xué)習(xí)即可...

    qpwoeiru96 評(píng)論0 收藏0
  • Python基礎(chǔ)(九)錯(cuò)誤和異常

    摘要:另一種常見(jiàn)錯(cuò)誤是邏輯錯(cuò)誤。當(dāng)檢測(cè)到一個(gè)錯(cuò)誤時(shí),解釋器就無(wú)法繼續(xù)執(zhí)行下去,于是拋出提示信息,即為異常。 錯(cuò)誤 >>> for i in range(10) File , line 1 for i in range(10) ^ SyntaxError: invalid syntax 上面那句話因?yàn)槿鄙倜疤?hào):,導(dǎo)致解釋器無(wú)法解釋,于是報(bào)錯(cuò)。這個(gè)...

    yimo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<