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