2011-08-25 142 views
29

我想知道...我前段時間閱讀過關於Go的內容,我試圖編寫一些內容。我似乎很有趣。但我已經達到handling "exceptions" in this language。我已閱讀他們的方法,這似乎是合理的。我想知道圍棋的標準特殊方法的優點是什麼?優缺點都有什麼?Google Go語言中的異常處理

編輯直言不諱:我不想對異常進行神聖的戰爭。我只是想知道這種處理錯誤的方式是否有優勢?這種風格與標準異常相比有什麼優勢?是否值得想知道?

回答

50

恐慌/恢復在道德上等同於try/catch異常。有一些表面上的差異(語法)和一個微妙但重要的預期用途的差異。

異常問題的最佳解釋是"Cleaner, more elegant, wrong",這是對異常優點/缺點與返回錯誤代碼的良好概述。

Go設計者決定通過從函數返回錯誤代碼進行錯誤處理是慣用的Go方式,並且該語言支持多個返回值以使其在語法上容易。雖然提供了恐慌/恢復,但這種差異不是功能性的,而是預期的用途。

暴露異常的其他語言促進了它們的使用,實際上它們經常被使用(有時甚至被濫用)。

Go不鼓勵使用恐慌/恢復。你可以做到,但你只能在非常有限的情況下做到這一點。

如果你看看Go自己的標準庫,大多數uses of panic都是用來表示在庫代碼中發生內部錯誤(即bug)或者調用庫有錯誤數據的致命錯誤(例如,將非json數據傳遞給json解碼功能)。

但是當你連接到指出的文章:「在去圖書館的慣例是,即使當一個包使用內部的恐慌,它的外部API仍存在明確的錯誤返回值。」

這與C#,Java,Python或C++等語言不同,在這些語言中,很多標準庫代碼可能會引發異常以發出信號錯誤。那些語言希望你使用例外。去阻止使用恐慌/恢復。

總結:

  • 慣用的圍棋風格是使用錯誤代碼來告訴錯誤呼叫者
  • 使用恐慌/恢復只有在極少數情況下:
    • 「撞車」程序當遇到內部不一致時,表明代碼中存在錯誤。這基本上是一個調試幫助。
    • 如果它極大地簡化了錯誤處理代碼中的(但是如果代碼是被他人使用,從來沒有揭露這種恐慌到呼叫者)

在實踐中,重要的是使用語言的地道樣式。在Go中返回錯誤代碼並避免恐慌/恢復。在C#這是一個使用異常來一些錯誤。

+0

謝謝,這是我所期望的答案。 – Archie

+0

Go作者並沒有完全禁止使用恐慌(至少不再是)。例如,Go wiki明確支持在包級別使用恐慌來進行深度嵌套調用。 https://code.google.com/p/go-wiki/wiki/PanicAndRecover#Usage_in_a_Package –