不少前端工程師看到這個標題可能會產生質問:
我js用得好好的,能后端能APP,為什么還要學習Python?
至少有下面兩個理由:
- 學習曲線。ES6之后的JavaScript(TypeScript)的在語法上和Python有很多異曲同工的地方,所以學習曲線非常平滑,上手難度很低。
- 應用場景。JavaScript雖然是web開發的王者,但是其在某些方面還是存在一些問題的。比如Node.js雖然可以寫后端,但大多用于CGI層,做接口整合和模板渲染,而Python、Java這類語言已被廣泛應用于后端服務編寫,同時Python在做機器學習等方面也很有優勢。
這篇文章我們通過對比兩種語言之間的“異常”來學習Python。
為什么需要對異常進行處理
異常是編寫代碼時必須考慮的問題,但卻并不是一個熱門話題,少有文章提到。
尤其在web前端這一塊,瀏覽器的強大容錯能力幫工程師解決(隱藏)了大量的異常。
但如果忽視異常輕則影響功能運行,重則導致系統崩潰,造成經濟損失。
異常處理
捕獲
JavaScript 異常捕獲關鍵字與 Python 一致,都是使用
try
。
// JavaScript
try {
?...
}
# Python
try:
?...
但是兩者都具有局限性:只能用來捕獲同步執行代碼的異常。
對于異步代碼的異常捕獲的情況 JavaScript 處理起來相對復雜,按運行環境就可以分為 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 的情況要簡單很多,即使使用異步線程或進程,也可以在函數內部進行捕獲,然后其它方式上報。
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 語句塊表示無論是否發生異常,語句塊代碼 一定會被執行。
不少讀者可能會以為在catch語句塊后執行的代碼和finally語句塊作用一樣,但其實是有區別的!
下面舉個例子
fn = () => {
?try {
? ?throw Error()
?} catch(e) {
? ?throw Error()
? ?return 1
?} finally {
? ?return 2
?}
?return 3
}
fn() // 是2不是3
也就是說 finally 語句塊中的代碼,不論 try 還是 catch 執行出錯都會執行。
Python的異常處理:
- except。可以指定需要處理的多個異常類型,可以有多個異常處理邏輯,寫法非常靈活。
- else。else 語句塊可以當 try 語句塊未發生異常時執行。
- 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 的做法和大多數高級語言一致,能多次、針對不同異常進行分別處理,else 關鍵字算是一個特色功能。
- 拋出方面,兩者只是關鍵字不同。
參考:
- 《如何優雅處理前端異常?》
- 《Python異常捕獲與處理》
- 《Python 異常處理》
- Python錯誤和異常
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
