很多前端工程師看到這個標題可能會產生質問:html
我js用得好好的,能後端能APP,爲何還要學習Python?前端
至少有下面兩個理由:python
這篇文章咱們經過對比兩種語言之間的「異常」來學習Python。web
異常是編寫代碼時必須考慮的問題,但卻並非一個熱門話題,少有文章提到。
尤爲在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語句塊後執行的代碼和finally語句塊做用同樣,但實際上是有區別的!
下面舉個例子
fn = () => { try { throw Error() } catch(e) { throw Error() return 1 } finally { return 2 } return 3 } fn() // 是2不是3
也就是說 finally 語句塊中的代碼,不論 try 仍是 catch 執行出錯都會執行。
Python的異常處理:
下面列舉使用 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的異常類型則豐富得多
參考: