您好,登錄后才能下訂單哦!
不少前端工程師看到這個(gè)標(biāo)題可能會產(chǎn)生質(zhì)問:
我js用得好好的,能后端能APP,為什么還要學(xué)習(xí)Python?
至少有下面兩個(gè)理由:
這篇文章我們通過對比兩種語言之間的“異?!眮韺W(xué)習(xí)Python。
異常是編寫代碼時(shí)必須考慮的問題,但卻并不是一個(gè)熱門話題,少有文章提到。
尤其在web前端這一塊,瀏覽器的強(qiáng)大容錯(cuò)能力幫工程師解決(隱藏)了大量的異常。
但如果忽視異常輕則影響功能運(yùn)行,重則導(dǎo)致系統(tǒng)崩潰,造成經(jīng)濟(jì)損失。
JavaScript 異常捕獲關(guān)鍵字與 Python 一致,都是使用try
。
// JavaScript
try {
?...
}
# Python
try:
?...
但是兩者都具有局限性:只能用來捕獲同步執(zhí)行代碼的異常。
對于異步代碼的異常捕獲的情況 JavaScript 處理起來相對復(fù)雜,按運(yùn)行環(huán)境就可以分為 Node.js 和 瀏覽器,按捕獲范圍又可以分為全部捕獲和局部捕獲。
// 瀏覽器全局異常捕獲
window.onError = e => {} ?
window.addEventListener('', e => {}) 捕獲請求錯(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 的情況要簡單很多,即使使用異步線程或進(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ù)雜,如無特殊說明,后文討論僅指使用try關(guān)鍵字的同步異常捕獲。
再看看JavaScript幾種處理異常方式。
不少讀者可能會以為在catch語句塊后執(zhí)行的代碼和finally語句塊作用一樣,但其實(shí)是有區(qū)別的!
下面舉個(gè)例子
fn = () => {
?try {
? ?throw Error()
?} catch(e) {
? ?throw Error()
? ?return 1
?} finally {
? ?return 2
?}
?return 3
}
fn() // 是2不是3
也就是說 finally 語句塊中的代碼,不論 try 還是 catch 執(zhí)行出錯(cuò)都會執(zhí)行。
Python的異常處理:
下面列舉使用 except 的幾個(gè)例子:
# 捕獲異常實(shí)例
except Exception as e:
# 批量異常捕獲
except (IOError, TypeError):
# 異常分類捕獲:
except OSError as err:
?...
except ValueError:
?...
except:
?...
JavaScript 中可以通過關(guān)鍵字 throw 來拋出一個(gè) Error 對象。
Python中與之對應(yīng)的是 raise ,用來拋出一個(gè) Exception 實(shí)例。
雖然關(guān)鍵字不一樣但是寫法基本相似:
// JavaScript
throw Error(...)
# Python
raise Exception(...)
對于 JavaScript 而言,談異常類的意義不大,處理不同的異常需要手動判斷,所以異常類型也比較簡單。
Python的異常類型則豐富得多
總結(jié)
參考:
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。