2012-03-26 97 views
2

只是一個簡單的問題,我似乎無法找到適合在線的答案。Java - 簡單的異常處理查詢

當我有一個try/catch塊,並且想要發現錯誤時,應該使用System.err.println(...)還是應該使用throw new Exception(...)

例如:

if (null==userList || null==credentials) 
    System.err.println("Did you call login() first?"); 
else 
{ 
    try 
    { 
     currentUser=(String) userList.nextElement(); 
     currentPass=(String) credentials.get(currentUser);   
    } 
    catch(NoSuchElementException nsee) 
    { 
     System.err.println("Is properties file blank?"); 
     //Or should this be 
     throw new NoSuchElementException("Is properties file blank?"); 
     nsee.printStackTrace(); 
    } 
} 

編輯:那麼,throw並不意味着去裏面catch?我可以使用throw而不是catch,還是僅用於方法簽名? 在這種情況下捕獲錯誤的正確方法是什麼,我將試圖確保屬性文件不是空白幷包含值? 此外,爲了清楚起見,我的目標是儘可能地向用戶清楚錯誤是什麼,所以他們立即知道他們需要修復它們的屬性文件。

+0

我認爲他們是不同的問題 - System.err主要是用於調試 – Coffee 2012-03-26 20:20:12

+0

一個奇怪的問題。重新投擲的決定似乎與您是否想要登錄它或在何處登錄無關。 – onnoweb 2012-03-26 20:20:26

回答

2

取決於你想要做什麼。

如果您的方法的合同無法履行如果發生異常(即無法返回您想要的值),則拋出新的異常。 (但是請注意,只是重新拋出新的異常,並沒有多大意義,只是聲明方法throws NoSuchELementException,讓例外傳播。)

如果您的合同可以在例外的情況下,滿足(即你可以如果沒有找到元素,則返回null),那麼你應該捕獲異常(如果你喜歡,使用System.err.println進行記錄),然後繼續執行。


上拋出一個新的異常的第一選擇一個側面說明:

你應該總是拋出一個異常,這是適合抽象目前的水平。例如,如果該方法被稱爲getUserFromList(...),並且由於某些與收集相關的問題而遇到NoSuchElementException,則應該捕獲該異常並拋出NoSuchUserException

爲了突出差異:

try { 
    currentUser=(String) userList.nextElement(); 
    currentPass=(String) credentials.get(currentUser);   

} catch(NoSuchElementException nsee) { 
       ^^^^^^^ 

    System.err.println("Is properties file blank?"); 
    throw new NoSuchUserException("Is properties file blank?"); 
        ^^^^ 
} 
0

這取決於你想要做什麼。

如果您重新拋出異常,函數將退出並且異常將被重新捕獲到調用堆棧的更上方。

如果只打印堆棧跟蹤,則控制返回到該函數,並且可以繼續執行。

下,雖然沒有任何意義:

try 
{ 
    currentUser=(String) userList.nextElement(); 
    currentPass=(String) credentials.get(currentUser);   
} 
catch(NoSuchElementException nsee) 
{ 
    throw new NoSuchElementException("Is properties file blank?"); 
} 

如果沒有捕獲異常,調用上下文負責也無妨。除非你明確想要更改字符串,否則沒有意義。

1

這取決於你的目標是什麼。如果您的目標是爲正在解釋日誌的人提供更多的上下文,那麼您可以將異常鏈接起來,並將其包裝在更具體的域中。

例如,您可以創建一個名爲ConfigurationException運行時異常並重新拋出這樣的:

} catch(NoSuchElementException nsee) { 
    throw new ConfigurationException("Expected non-blank properties file", nsee); 
} 

通常情況下,最好不要直接登錄到System.err(因爲你的用戶可能不會看它)而是配置一個日誌框架(log4j,slf4j,Java日誌API等)。然後,如果需要,可以將記錄器配置爲追加到錯誤流。

0

這取決於你想要做什麼。 如果您只需要關於異常被捕獲的信息[例如:對於日誌記錄,那麼syserr就足夠了。 但是,如果你想處理這個異常,你應該把它扔到上層並在那裏處理它或者在catch塊內處理它。 在你的情況下,你應該通過發回有關獲取用戶名/密碼失敗的信息來處理它。