2012-08-16 50 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