學(xué)習(xí)了怎么區(qū)分操作失敗,即那些可以被預(yù)測的哪怕在正確的程序里也無法避免的錯誤(例如,無法連接到服務(wù)器);而程序的Bug則是程序員失誤。
操作失敗可以被處理,也應(yīng)當(dāng)被處理。程序員的失誤無法被處理或可靠地恢復(fù)(本不應(yīng)該這么做),嘗試這么做只會讓問題更難調(diào)試。
一個給定的函數(shù),它處理異常的方式要么是同步(用throw方式)要么是異步的(用callback或者EventEmitter),不會兩者兼具。用戶可以在回調(diào)函數(shù)里處理錯誤,也可以使用?try/catch
捕獲異常 ,但是不能一起用。實際上,使用throw并且期望調(diào)用者使用?try/catch
?是很罕見的,因為 NodeJS 里的同步函數(shù)通常不會產(chǎn)生運行失?。ㄖ饕睦馐穷愃朴?code>JSON.parse的用戶輸入驗證函數(shù))。
在寫新函數(shù)的時候,用文檔清楚地記錄函數(shù)預(yù)期的參數(shù),包括它們的類型、是否有其它約束(例如必須是有效的IP地址),可能會發(fā)生的合理的操作失敗(例如無法解析主機(jī)名,連接服務(wù)器失敗,所有的服務(wù)器端錯誤),錯誤是怎么傳遞給調(diào)用者的(同步,用throw
,還是異步,用 callback 和 EventEmitter)。
缺少參數(shù)或者參數(shù)無效是程序員的失誤,一旦發(fā)生總是應(yīng)該拋出異常。函數(shù)的作者認(rèn)為的可接受的參數(shù)可能會有一個灰色地帶,但是如果傳遞的是一個文檔里寫明接收的參數(shù)以外的東西,那就是一個程序員失誤。
更多建議: