摘要:但如果忽視異常輕則影響功能運行,重則導致系統(tǒng)崩潰,造成經濟損失。異常處理捕獲異常捕獲關鍵字與一致,都是使用。語句塊表示無論是否發(fā)生異常,語句塊代碼一定會被執(zhí)行。
不少前端工程師看到這個標題可能會產生質問:
我js用得好好的,能后端能APP,為什么還要學習Python?
至少有下面兩個理由:
學習曲線。ES6之后的JavaScript(TypeScript)的在語法上和Python有很多異曲同工的地方,所以學習曲線非常平滑,上手難度很低。
應用場景。JavaScript雖然是web開發(fā)的王者,但是其在某些方面還是存在一些問題的。比如Node.js雖然可以寫后端,但大多用于CGI層,做接口整合和模板渲染,而Python、Java這類語言已被廣泛應用于后端服務編寫,同時Python在做機器學習等方面也很有優(yōu)勢。
這篇文章我們通過對比兩種語言之間的“異常”來學習Python。
為什么需要對異常進行處理異常是編寫代碼時必須考慮的問題,但卻并不是一個熱門話題,少有文章提到。
尤其在web前端這一塊,瀏覽器的強大容錯能力幫工程師解決(隱藏)了大量的異常。
但如果忽視異常輕則影響功能運行,重則導致系統(tǒng)崩潰,造成經濟損失。
JavaScript 異常捕獲關鍵字與 Python 一致,都是使用try。
// JavaScript try { ... } # Python try: ...
但是兩者都具有局限性:只能用來捕獲同步執(zhí)行代碼的異常。
對于異步代碼的異常捕獲的情況 JavaScript 處理起來相對復雜,按運行環(huán)境就可以分為 Node.js 和 瀏覽器,按捕獲范圍又可以分為全部捕獲和局部捕獲。
// 瀏覽器全局異常捕獲 window.onError = e => {} window.addEventListener("", e => {}) 捕獲請求錯誤 // 瀏覽器Ajax異常捕獲 var xhr = new XMLHttpRequest(); xhr.onload = function(e) { if(this.status > 400){ ... } }; // Node.js 全局異常捕獲 process.on("uncaughtException", e => {}) // Node.js 回調方式異常捕獲 fs.readFile("/etc/passwd", (err, data) => { if (err) { ... } });
Python 的情況要簡單很多,即使使用異步線程或進程,也可以在函數(shù)內部進行捕獲,然后其它方式上報。
def _parse_speed(key_name, speed_list): try: ... t = threading.Thread(target=_parse_speed, args=(v, speed_list)) t.start()
由于異常捕獲情況比較復雜,如無特殊說明,后文討論僅指使用try關鍵字的同步異常捕獲。
處理再看看JavaScript幾種處理異常方式。
catch。catch 語句塊用來處理異常,處理方式也相當粗放,try 語句塊內的所有異常都會被捕獲。
finally。finally 語句塊表示無論是否發(fā)生異常,語句塊代碼一定會被執(zhí)行。
不少讀者可能會以為在catch語句塊后執(zhí)行的代碼和finally語句塊作用一樣,但其實是有區(qū)別的!
下面舉個例子
fn = () => { try { throw Error() } catch(e) { throw Error() return 1 } finally { return 2 } return 3 } fn() // 是2不是3
也就是說 finally 語句塊中的代碼,不論 try 還是 catch 執(zhí)行出錯都會執(zhí)行。
Python的異常處理:
except。可以指定需要處理的多個異常類型,可以有多個異常處理邏輯,寫法非常靈活。
else。else 語句塊可以當 try 語句塊未發(fā)生異常時執(zhí)行。
finally。特性同 JavaScript。
下面列舉使用 except 的幾個例子:
# 捕獲異常實例 except Exception as e: # 批量異常捕獲 except (IOError, TypeError): # 異常分類捕獲: except OSError as err: ... except ValueError: ... except: ...拋出
JavaScript 中可以通過關鍵字 throw 來拋出一個 Error 對象。
Python中與之對應的是 raise ,用來拋出一個 Exception 實例。
雖然關鍵字不一樣但是寫法基本相似:
// JavaScript throw Error(...) # Python raise Exception(...)異常類型
對于 JavaScript 而言,談異常類的意義不大,處理不同的異常需要手動判斷,所以異常類型也比較簡單。
Python的異常類型則豐富得多
捕獲方面,JavaScript 的場景要比 Python 復雜,遷移學習 Python 很簡單。
處理方面,兩者都支持 finally 關鍵字。不同的是JavaScript 的操作被簡化,只能通過一個 catch 語句塊來處理所有類型異常。而 Python 的做法和大多數(shù)高級語言一致,能多次、針對不同異常進行分別處理,else 關鍵字算是一個特色功能。
拋出方面,兩者只是關鍵字不同。
參考:
《如何優(yōu)雅處理前端異常?》
《Python異常捕獲與處理》
《Python 異常處理》
Python錯誤和異常
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106283.html
摘要:耗時代碼運行到這句之后觸發(fā)隱式等待,在輪詢檢查后仍然沒有定位到元素,拋出異常。耗時值得一提的是,對于定位不到元素的時候,從耗時方面隱式等待和強制等待沒什么區(qū)別。 ...
摘要:不過動態(tài)渲染的頁面不止這一種。再有淘寶這種頁面,它即使是獲取的數(shù)據,但是其接口含有很多加密參數(shù),我們難以直接找出其規(guī)律,也很難直接分析來抓取。我們用一個實例來感受一下在這里們依然是先打開知乎頁面,然后獲取提問按鈕這個節(jié)點,再將其 上一篇文章:Python3網絡爬蟲實戰(zhàn)---36、分析Ajax爬取今日頭條街拍美圖下一篇文章:Python3網絡爬蟲實戰(zhàn)---38、動態(tài)渲染頁面抓取:Spla...
摘要:引上下文管理器太極生兩儀,兩儀為陰陽。而最常用的則是,即上下文管理器使用上下文管理器用之后的文件讀寫會變成我們看到用了之后,代碼沒有了創(chuàng)建,也沒有了釋放。實現(xiàn)上下文管理器我們先感性地對進行猜測。現(xiàn)實一個上下文管理器就是這么簡單。 Python有什么好學的這句話可不是反問句,而是問句哦。 主要是煎魚覺得太多的人覺得Python的語法較為簡單,寫出來的代碼只要符合邏輯,不需要太多的學習即可...
摘要:另一種常見錯誤是邏輯錯誤。當檢測到一個錯誤時,解釋器就無法繼續(xù)執(zhí)行下去,于是拋出提示信息,即為異常。 錯誤 >>> for i in range(10) File , line 1 for i in range(10) ^ SyntaxError: invalid syntax 上面那句話因為缺少冒號:,導致解釋器無法解釋,于是報錯。這個...
閱讀 3196·2021-11-18 10:02
閱讀 1446·2021-10-12 10:08
閱讀 1239·2021-10-11 10:58
閱讀 1269·2021-10-11 10:57
閱讀 1167·2021-10-08 10:04
閱讀 2121·2021-09-29 09:35
閱讀 773·2021-09-22 15:44
閱讀 1269·2021-09-03 10:30