2013-11-21 44 views
1

假設我想在我的代碼中有一個特定「案例」的未經檢查的例外 - 說當一個隊列已滿75%時。我需要的只是一個例外情況,說「隊列已達到75%的閾值」。Wrinng a RuntimeException

One--這樣做的最明顯的(?)的方式是

public class QueueT extends RuntimeException { 
    QueueT() { 
     super("queue has reached the 75% threshold"); 
    } 
} 

所有&只能用我對這個例外是

try { 
    // some stuff here 
    throw new QueueT(); 
    } catch (QueueT e) { 
     System.out.print("<<"+e+">>"); 
     } 

什麼我不知道is--通過與上述 - 我寫了一個例外 -
,而不是下面我得到什麼。回想一下:我沒有其他用途 - 將不需要其他方法Throwable或其他任何東西。

try { 
    // some stuff here 
    throw new RuntimeException("queue has reached the 75% threshold"); 
    } catch (RuntimeException e) { 
      System.out.print("<<"+e+">>"); 
     } 

從我看到的,唯一的收穫,我有是調用構造函數沒有煩心事字符串屬性的舒適度。

它甚至gainful--我可以很容易地參數,我會扔在例外的門檻:

// setting the percentage value here 
throw new RuntimeException("queue has reached the" + percentage + "% threshold"); 

在此先感謝。

+0

創建您自己的異常類型,您可以針對異常和其他RuntimeException使用不同的try-catch塊,如果需要,可以添加更多funcionality。 –

回答

0

你獲得什麼,在你的第一個例子,

try { 
    // some stuff here 
    throw new QueueT(); 
} catch (RuntimeException e) { 
    System.out.print("<<"+e+">>"); 
} 

如果更換catch (RuntimeException e)catch (QueueTe)

try { 
    // some stuff here 
    throw new QueueT(); 
} catch (QueueTe e) { 
    System.out.print("<<"+e+">>"); 
} 

在這裏,你可以非常精確地說趕上什麼類型的錯誤。否則,可能會有另一部分代碼引發運行時異常,並且處理幾乎完整隊列的代碼可能會嘗試應用於與隊列完全無關的異常。如果您只捕捉到QueueT異常,則可以更好,更精確地應用代碼。

+0

複製粘貼錯誤 - 更正它。它應該是一個QueueT異常。 – Roam

+0

哦,好的。那麼,我的答案的下半部分仍然適用 – Avery

+0

我想知道是否有任何其他「幕後」,但我想這就是它。還沒有仔細看過'原因'。肯定會有差異。抑制性例外。 thx爲輸入。 – Roam

0

第一個呼叫的興趣是容易的,如果你改變了一下catch子句明白:

try { 
// some stuff here 
throw new QueueT(); 
} catch (QueueT e) { 
    System.out.print("<<"+e+">>"); 
} 

所以你只能望塵莫及QueueT的實例,而不是潛在的其他運行時像空指針,這類的例外情況下,您最好讓它傳播到入口點以檢測某些編碼或設計問題。 事實上,在您首先編寫的代碼中,您將無法區分預期的完整隊列與真實運行時錯誤。您將丟失錯誤信息,程序將充當隊列滿,而不是

一個好的做法是永遠不要捕獲異常超類型,既不是運行時也不是throwable(最糟糕的一種)。

另一個是用異常後綴命名異常:例如QueueAboutFullException。

另一個不是用異常編程,如果你發現異常的地方與你拋出它的地方大致相同。如果因爲費用比中斷小得多,請選擇簡單

+0

re.your第二個下面的代碼3--爲什麼正確 - 這就是問題 – Roam

+0

第二部分只是在聲明異常類時添加百分比屬性,並添加一個處理此參數的構造函數(如'super(「隊列已達到「+百分比+」%閾值「) – Gab

2

假設我想對代碼中的某個特定「案例」進行未經檢查的異常 - 比如當一個隊列已滿75%時。我需要的只是一個例外情況,說「隊列已達到75%的閾值」。

這是一個例外情況。異常不用於業務邏輯;它們用於例外的條件。這似乎是預期的方案,更像通知而不是異常。你會如何期待一個捕捉到這個異常的人做出反應?只是忽略它?如果是這樣,這個例外的目的是什麼?此外,以這種方式使用異常並不是高性能的,因爲它必須填寫堆棧跟蹤,反覆執行這些操作會使您的性能非常糟糕。

至於你的其他問題,使用自己的運行時異常而不是RuntimeException的好處是,你現在有自己的異常(希望)在語義上是適當的,你可以適當地拋出或處理。簡單地使用RuntimeException本身並不能提供太多的信息。

+1

我完全同意第一部分 – Gab