2011-09-29 54 views
2

我正在寫一個小型庫,並且需要訪問幾種不同類型的文件。儘管訪問方法本身對於每種文件格式都是不同的,但它們似乎有很多共同之處,並且我在類層次結構中放置了一個接口,其中我編寫了一個應連接到數據源的方法。Java:我應該/除了身份驗證時拋出什麼?

但是,由於數據源可能受密碼和/或用戶權限的保護,因此有時需要驗證才能檢索數據。我的問題是:

  1. 當需要驗證時拋出異常是個好主意嗎?

    由於我想盡可能少地公開實現,我只想告訴用戶發生了什麼事。但是身份驗證可能需要許多不同的東西(用戶名,密碼等),因此可以將它們打包成一個例外並將其扔出?或者,也許有更好的方式,而不訴諸於例外,因爲「需要驗證」並不是真正的例外通常用來處理的例外行爲。

  2. 需要身份驗證時拋出什麼異常?

    現在假設我決定使用異常來處理這個問題。我應該拋出哪個異常?隨Java API附帶的幾個AuthenticationException似乎不符合此要求,因爲它們似乎都非常具體,例如在命名服務中使用。我不確定是否需要SecurityException,但如果這不合適,我仍然不想拋出自己的異常,因爲這會阻礙其他人理解我的代碼以及API背後發生的情況。

感謝您的任何意見!這有點冗長,也許過於冗長,所以任何可以改善問題的編輯都非常受歡迎。

+0

那你現在的API如何? 'openFile(String name,String userName,String password);'並且調用者不知道是否對於特定的文件調用應該是'openFile(name,null,null);''或'openFile(name,administrator)「1234 「);'? – Cratylus

+0

@ user384706:現在我只是重載了這些方法,並提供了一個只有文件地址的版本,一個帶有密碼,另一個帶有用戶名和密碼。所有三個都會在失敗時拋出異常,第一個和第二個只是調用第三個方法來實現結果。感謝評論! –

回答

1

由於它是您自己的API,因此您可以創建自己的Exception來處理它,它可以包含詳細信息......使用與您的異常「聽起來最接近」的Java異常沒有任何要求或好處。

我個人發現,用try/catch塊來加密我的代碼是...乏味和難看。所以我嘗試製作不需要它的API。

在你的情況,也許你可以提供查詢,以便您的API客戶端可以預檢的行動,以及它們的使用可能看起來像:

Thing t = new Thing(...); 
if(t.needsAuth()) 
{ 
    boolean ok = t.doPassword("abc123"); 
    if(!ok) 
    log("wrong password"); 
} 
boolean did= t.doIt(); 
if(!did) 
    log("sorry: " + t.getProblem()); 
3

AuthenticationException

我會去與投擲AuthenticationException消息要麼是如果登錄是必要的,如果通行證不好,用戶名或密碼錯誤。

不透露是否存在登錄是最佳做法。有時在HTTP中,通常隱藏未被發現的未經授權的訪問。所以如果證書不允許連接它就像連接不存在一樣。

+1

+1關於認證和披露的忠告!謝謝! –

相關問題