從JavaScript到Python之異常

很多前端工程師看到這個標題可能會產生質問:html

我js用得好好的,能後端能APP,爲何還要學習Python?前端

至少有下面兩個理由:python

  1. 學習曲線。ES6以後的JavaScript(TypeScript)的在語法上和Python有不少殊途同歸的地方,因此學習曲線很是平滑,上手難度很低。
  2. 應用場景。JavaScript雖然是web開發的王者,可是其在某些方面仍是存在一些問題的。好比Node.js雖然能夠寫後端,但大多用於CGI層,作接口整合和模板渲染,而Python、Java這類語言已被普遍應用於後端服務編寫,同時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。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 而言,談異常類的意義不大,處理不一樣的異常須要手動判斷,因此異常類型也比較簡單。

{% asset_img js-error.jpg %}

Python的異常類型則豐富得多
{% asset_img py-error.jpg %}

總結

  • 捕獲方面,JavaScript 的場景要比 Python 複雜,遷移學習 Python 很簡單。
  • 處理方面,二者都支持 finally 關鍵字。不一樣的是JavaScript 的操做被簡化,只能經過一個 catch 語句塊來處理全部類型異常。而 Python 的作法和大多數高級語言一致,能屢次、針對不一樣異常進行分別處理,else 關鍵字算是一個特點功能。
  • 拋出方面,二者只是關鍵字不一樣。

參考:

相關文章
相關標籤/搜索