目前我正在使用Playframework2开发网站。我只是编程的初学者。我读了一些关于异常的书,但现在在现实世界中,异常处理真的很奇怪。
说实话,我并不关心抛出什么异常,我以同样的方式处理所有异常。
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;
}
每次我想连接到db时,这也会导致try和catch。我的问题是我认为我不能很好地处理它们。
代码示例:
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());
}
在这种情况下,我懒得写同样的尝试并反复捕捉,这是重复的代码。
也许有一本书解释了如何设计一个带有异常处理的大型应用程序?
答案 0 :(得分:4)
当您调用方法时,您不一定必须在那里捕获异常。您可以让调用者处理它们(如果它是一个已检查的异常,则声明一个throws子句)。实际上,将它们传递给调用者而无需任何额外工作的能力是例外的显着特征。
我的团队采用了以下编码标准:当我们想要从失败中恢复时,我们会抛出已检查的异常,并为其他任何事情取消选中异常。对于调用堆栈中如此高的方法中的未经检查的异常,只有一个catch块,所有请求都通过它(例如在ServletFilter
中)。此catch块记录异常,并将用户转发到“抱歉,这不应该发生”页面。
答案 1 :(得分:3)
您是否查看过您的代码以了解为什么要抛出所有这些异常?有例外是有理由告诉你出了问题。如果您编写了太多“样板”try-catch
代码并且您不在千行申请中,则必须进行重构。
try-catch
当你有一个复杂的块并且变得非常单调和样板(Marc Gravell even said he usually uses try-finally
)时会很烦人但是作为一个新的程序员,检查你编写的代码会很有帮助并弄清楚如何处理或避免这些例外。
正如akf所提到的,忽略异常也可能对调试造成危害。如果你错过导致它的异常,那么追踪灾难性出错的地方将会更加困难。