2014-07-24 37 views
0

我一直在網上搜索和研究一些書籍,但給出的例子是有限的,我仍然對用戶定義的異常有些懷疑。用戶定義異常的實現

使用以下代碼作爲示例:

//Conventional way of writing user-defined exception 
class IdException extends Exception 

{ 
    public IdException(String s) 
    { 
     super(s); 
    } 
} 

class Product 
{ 
    String id = new String(); 
    public Product(String _id) throws IdException 
    { 
     id = _id; 

     //Check format of id 
     if (id.length() < 5) 
      throw(new IdException(_id)); 
    } 
} 

似乎寫入用戶定義的異常的傳統方式是幾乎總是相同的。在用戶定義的異常的構造函數中,我們始終調用super(msg)。這在我觸發一個問題:如果大多數例外以這種方式實現,所有這些例外之間有什麼區別?

例如,我可以有多個用戶定義的異常,但似乎沒有任何差異,可以做同樣的事情。 (有這些異常沒有實現,是什麼讓他們的工作?)

例子:

class IdException extends Exception 
{ 
    public IdException(String s) 
    { 
     super(s); 
    } 
} 

class NameException extends Exception 
{ 
    public NameException(String s) 
    { 
     super(s); 
    } 
} 

class ItemException extends Exception 
{ 
    public ItemException(String s) 
    { 
     super(s); 
    } 
} 

QUE:所以我們不應該(例如)實施id內檢查異常類?如果不是所有異常類似乎都做同樣的事情(或者什麼都不做)。

在異常實施檢查的例子:

class IdException extends Exception  { 
    public IdException(String s) 
    { 
     super(s); 
     //Can we either place the if-statements here to check format of id ? 
    } 
    //Or here ? 
} 

回答

1

理想情況下,你不應該實施內部異常你的業務邏輯。異常告訴關於異常行爲的信息,並且在自定義異常中,您可以自定義該信息。

找到best practice來編寫自定義異常。

+0

這就是我不明白這一點。如果我們不在例外情況下實施邏輯。在我的例子中,'IdException','NameException'和ItemException似乎都做同樣的事情。那麼爲什麼我們仍然實現了許多相同的異常呢?謝謝。 – user3437460

+0

@ user3437460可以在代碼中重用異常的類型,以便爲'try {...} catch(...){...}'塊中的不同類型的異常生成不同的分支(請參閱@ sp00ms答案)和你可以從關鍵參數中創建一個格式化的消息,使'throw'代碼更具可讀性,並且仍然產生一個漂亮可讀的消息文本(參見我的答案)。 – AlexR

+0

自定義異常是自定義原因的原因。在每個自定義異常中,您都可以非常明確地定製您的信息 –

0

我們已經在java中定義了很多例外。所有人都做同樣的事情:to notify user about the problem in code

現在假設我們只有一個異常,那麼如何才能在拋出異常時發生什麼錯誤。畢竟,名字很重要。

0

要採取你的榜樣例外,我會通過創造一個更加複雜的消息格式化提供的數據顯示:

public IdException(String id, String detail) { 
    super(String.format("The id \"%s\" is invalid: %s", id, detail)); 
} 

throw new IdException(_id, "Id too short."); 

這種方式存在的IdException類沒有實際的邏輯不是提供給定值( id)和在一起的詳細消息在e.getMessage()字符串所以調試和記錄是容易閱讀和代碼本身也很簡單:

有somethi ng與Id _id錯誤,即它太短。因此,我們把它扔回來。

而且,當你把不同類型的代碼例外的,它可以讓來電者的代碼來處理每種異常類型是不同的:

try { 
    getItem(id, name); 
} catch (IdException ex) { 
    fail(ex.getMessage()); // "The Id is bogus, I don't know what you want from me." 
} catch (NameException ex) { 
    warn(ex.getMessage()); // "The name doesn't match the Id, but here's the Item for that Id anyways" 
} catch (ItemException ex) { 
    fail("Duh! I reported to the dev, something happened"); 
    emailToAdmin(ex.getMessage()); // "The Item has some inconsistent data in the DB" 
}