2010-09-29 50 views
0

我在寫一個返回不同類型的錯誤的Web服務。
每種方法都可以返回三種基本類型的錯誤之一:
GeneralInvalidInputNon
除了這三個可能的值,每個方法可以有它自己的錯誤(例如進行登錄方法 - InvalidPassword) - 但每種方法只能返回一個錯誤。
因此,例如SignIn方法將能夠返回以下錯誤類型之一:General,InvalidInput,Non,InvalidPassword。
起初我以爲用枚舉,但我現在認爲,錯誤類型應該實現繼承,因爲有三個基本類型,每個新方法的錯誤類型從繼承。但我真的不能想象如何。我想用一個靜態類的 - 但隨後將只有一個字符串的靜態字段 - 和繼承是無關緊要的一次...
使用枚舉的另一個問題是,什麼樣的Web服務的客戶將得到最終是一個毫無意義的INT(通過JSON )什麼是一個枚舉的好替代品?

所以我的問題是:什麼是傳達的想法,有三種基本的可能值的一個很好的方式,你可以添加到這些,使一個新類型的錯誤?

回答

6

這將是最好的,如果你重新考慮你的接口。

這是迄今爲止最好使用了錯誤代碼例外,不僅因爲它是那麼容易的有關檢查錯誤代碼忘記,而且還因爲它是難以維持他們,使他們獨特而有意義的。

約翰·桑德斯states類似的線程:

[...]你應該拋出一個SoapException。這或多或少會直接轉化爲SOAP Fault。 SOAP錯誤是指出Web服務操作錯誤的適當方式,其原因與異常優於常規方法中的返回狀態相同 - 您不必在調用點檢查返回狀態。

除了扔SoapException你也可以拋出任意異常。 ASP.NET會將這些異常包裝到傳遞給客戶端的SoapException中。客戶可以在SoapException的內部例外中訪問例外的詳細信息。

對於進一步解釋也看到:

Handling and Throwing Exceptions in XML Web Services

+0

我真的畢業了,不能跟你的人爭論,但恕我直言,這不是一個很好的解決方案 - 例外往往掩蓋真正的問題。我希望我的代碼能夠優雅地達到返回語句,即使它只是爲了宣佈一路上出錯了。我確信我可以找到一個着名的專業程序員的博客帖子說... ..這裏是 - http: //www.joelonsoftware.com/items/2003/10/13.html。還是我沒有得到你? – 2010-09-29 22:06:49

+0

@Oren A:我不會說喬爾一般就在這裏,但我相信他只是指Eric Lippert在他的[博客文章]中稱之爲令人煩惱的例外*的異常(http://blogs.msdn的.com/b/ericlippert /存檔/ 2008/09/10 /傷腦筋-exceptions.aspx)。 – 2010-09-29 22:15:04

+1

@ 0xA3,我認爲OP在這個特殊用例中可能有一點意義。我想我們都可以同意普通的C#異常是SoapExceptions的正確類比。我認爲SignIn方法實際上返回SignIn的結果是合理的 - 它不會返回任何其他內容。無效的用戶名實際上不是*例外*。國際海事組織,我只使用異常時,代碼中有**錯誤**不是由於用戶輸入無效。 – 2010-09-29 22:19:45