2012-08-16 95 views
1

目前我正在使用Playframework2開發網站。我只是編程的初學者。我讀了一些關於異常的書,但是現在在真實世界中,異常處理真的很奇怪。Java中的例外

老實說,我並不在乎拋出了什麼異常,我以同樣的方式處理所有異常。 return badrequest();。我只使用例外進行日誌記錄。

try{ 
... 
} 
catch(Exeption e){ 
//log 
return badrequest(); 
} 

但是,這是如此多的樣板,它真的很煩人,因爲每個方法都會拋出相同的異常。

您可以給我的任何提示,提示或資源?

編輯:

一個例子是我的「全局」配置文件。因爲我需要連接到數據庫每次我以爲我可以寫這個問題的單身人士。

private Datastore connect() throws UnknownHostException, MongoException, 
      DbAuthException { 

     Mongo m = new Mongo(dbUrl, dbPort); 
     Datastore ds = new Morphia().createDatastore(m, dbName); 
     boolean con = ds.getDB().authenticate(username, password.toCharArray()); 
     if (!con) 
      throw new DbAuthException(); 
     return ds; 
    } 

這也會導致嘗試並捕獲每次我想連接到分貝。我的問題是我不認爲我可以很難處理它們。

一個代碼示例:

public static Result addComment(String title) { 
     try { 

      Datastore ds = DatabaseConnect.getInstance().getDatastore(); 
      Form<Comment> filledForm = commentForm.bindFromRequest(); 
      Comment userComment = filledForm.get(); 
      userComment.setUsername(Util.getUsernameFromSession(ctx())); 
      User.increasePointsBy(ctx(), 1); 
      UserGuides.addComment(title, userComment); 
     } catch (Exception e) { 
      return badRequest(); 
     } 
     return redirect(routes.Guides.blank()); 
    } 

在這種情況下,我是懶得寫同樣的嘗試,並再次趕了個遍,這是重複的代碼。

也許有一本書解釋瞭如何設計一個具有異常處理的大型應用程序?

+2

關於什麼的提示,提示或資源? Web應用程序應該優雅地處理異常(如果不需要終止)。 – 2012-08-16 20:09:55

+0

我不確定你正在使用哪個IDE,但是如果你使用的是eclipse,你也可以使用「代碼模板」來加速你的工作。通常,如果可能的話,您想盡量避免重複代碼,但是在某些情況下,您無法使用代碼模板和代碼模板來幫助加快此過程。 – 2012-08-16 23:38:06

回答

4

當你調用一個方法時,你不一定要在那裏捕捉異常。你可以讓你的調用者處理它們(如果它是一個檢查的異常,則聲明一個throws子句)。事實上,將它們傳遞給呼叫者而無需額外工作的能力是例外的顯着特徵。

我的團隊採用了以下編碼標準:當我們想要從失敗中恢復時,我們爲這些罕見情況拋出檢查異常,並取消選中其他任何異常。對於調用堆棧中非常高的方法,只有一個catch塊用於未檢查的異常,以使所有請求都通過它(例如在ServletFilter中)。該catch塊記錄異常,並將用戶轉發到「Sorry,this should not have happened」頁面。

+0

對於使用*異常屏障*的建議+1,要走的路。注意:這種方法確實涉及樣板'try {...} catch(RuntimeException e){throw e; } catch(Exception e){拋出新的RuntimeException(e); }'圍繞任何聲明檢查異常的代碼。 – 2012-08-16 20:24:49

+0

哦......是的,我很愚蠢。如果我可以將它們傳遞給更高級的實例,我只需要捕捉它們一次。是的這更有意義。 – 2012-08-16 20:25:11

+0

邁克,這是異常機制的美麗。事實上,這正是它首先存在的原因,而不是像C那樣通過返回值傳遞錯誤信息。令人遺憾的是,被檢查的異常造成了教學上的破壞,迫使不信任的開發者當場處理異常通常以錯誤的方式。 – 2012-08-16 20:28:48

3

你看過你的代碼來檢查爲什麼拋出所有這些異常?例外是有原因的 - 告訴你出了問題。如果你寫了太多的「樣板」try-catch代碼,並且你不在千線應用程序中,則必須重構。

try-catch當你有一個複雜的塊,可以變得非常單調和樣板(Marc Gravell even said he usually uses try-finally),但作爲一個新的程序員,它會有助於你檢查你寫的代碼,並找出如何處理或避免這些例外。

正如akf提到的那樣,忽略異常也會對調試造成危害。如果你錯過了導致它的例外情況,那麼追蹤哪裏發生災難性的事情就會變得更加困難。

+2

我會補充說,簡單地忽略異常是非常不好的做法。您至少應該將其打印到日誌中,否則您將沒有任何與您的代碼相關的實際問題的痕跡 – akf 2012-08-16 20:15:47

+0

@akf謝謝,我已在我的答案中添加了一部分以反映這一點。 – 2012-08-16 20:18:50

+0

我更新了我的帖子。目前我只能看到一般例外情況。然後我記錄所有這些異常,但這仍然是重複的代碼 – 2012-08-16 20:19:09