2012-11-07 25 views
26

如果我在Java中有未處理的異常,Eclipse爲我提供了兩個選項:(1)添加throws聲明和(2)try/catch環繞聲。在Eclipse中更改未處理的異常自動生成的catch代碼?

如果讓我選擇(2)它增加了一個代碼

try { 
    myfunction(); 
} catch (MyUnhandledException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

我想改變這

try { 
    myfunction(); 
} catch (MyUnhandledException e) { 
    throw new RuntimeException(e); 
} 

這可能嗎?

UPDATE

爲什麼這麼愛改變話題的人???

如果捕獲並打印異常,則不需要再捕捉異常。如果我忘記處理異常,我喜歡我的應用程序崩潰。所以,我喜歡在默認情況下重新拋出它。

+0

只需選擇選項(1)如果這是你想要做什麼。 –

+0

注意:請閱讀該問題。明確的目標是選擇選項2,但使用不隱藏異常的* default * catch塊,以防編碼器忘記處理異常。這是合理的。哎呀,我正在考慮自己做。 –

+0

舊主題..但你最好將默認catch塊更新爲不會編譯的東西,這會強制你記住在編譯時處理異常。 – crig

回答

34

是的,您可以更改Eclipse添加的默認代碼。

  1. 在首選項,導航到的Java>代碼樣式>代碼模板
  2. 根據代碼,請選擇捕捉塊體
  3. 按編輯按鈕更改代碼。完成後,按 確定按鈕。

考慮在默認catch塊中添加TODO註釋。例如,默認包括:

 // ${todo} Auto-generated catch block 
+8

難以置信!你回答了問題,也沒有其他答案! –

+2

謝謝你的想法,我現在也在使用它。 –

0

如果你從catch子句中重新拋出你的異常,那麼你將不得不在調用你當前方法的方法中處理。但是如果你在RuntimeException中包裝你的異常,你將不需要處理它。但是,你爲什麼要這樣做?

我的意思是,爲什麼不只是: -

try { 
    myfunction(); 
} catch (MyUnhandledException e) { 
    throw e; 
} 

因爲,在你的代碼,基本上你一個包裹可能是checked exceptionunchecked one。如果我假設您的MyUnhandledExceptionchecked exception

並且請注意,如果您採用這種方法,您仍然需要在您的throws clausedeclare itthrown

如果你只是想按照自己的方式去做,那麼它也能正常工作。根據@ Andy的回答,您可以更改Eclipse setting

但是,最好看看你的設計。爲什麼這個方法會被覆蓋拋出一個沒有在你的overriden方法中聲明的異常。可能有錯,應該糾正。

+0

如果我能夠拋出'MyUnhandledException'那麼它不是一個錯誤。從這個問題很明顯,MyUnhandledException不是運行時,並且在方法聲明中沒有描述 - 這是唯一的情況異常導致編譯器錯誤。所以我需要在運行時包裝器中重新引發異常而不是更改聲明。如果方法被忽略,這可能是必需的。 –

+0

@SuzanCioc。那麼,在這種情況下,它會起作用。這沒有問題。但是,最好還是看看你的重寫方法。如果被覆蓋的方法拋出未在'overriden'方法中聲明的異常,則肯定有錯誤。 –

+0

C#中沒有檢查異常,並且在那裏沒有任何問題。所以,任何異常都可以被包裝到'RuntimeException'中,除了異常本身之外,它不會導致任何額外的麻煩。 –

1

就個人而言,我使用一個通用的成語,而不管實際檢查的異常類型的,你可以使Eclipse使用,作爲一個模板來代替:

try { 
... 
} 
catch (RuntimeException e) { throw e; } 
catch (Exception e) { throw new RuntimeException(e); } 

的一點是包裝整個代碼塊,而不是每個可能引發異常的行。該塊可能會拋出任何數量的已檢查和未檢查的異常,並且這將允許未經檢查的異常通過未受到傷害,並且已檢查的異常將被封裝。

0

您可能已經意識到了這一點...但是如果您想擺脫檢查異常中所有討厭的混亂和刺激,爲什麼不只是將throws Exception添加到每種單一方法?

在一個重寫的接口方法的情況下,這種模式的可再使用:

@Override 
public void close() throws IOException { 
    try { 
     _close(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     throw new RuntimeException(e); 
    } 
} 

private void _close() throws Exception { 
    // ... closing ops 
} 
相關問題