1

目前我正在使用 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;
    }

这也导致每次我想连接到数据库时都会尝试并捕获。我的问题是我认为我无法处理它们。

代码示例:

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());
    }

在这种情况下,我懒得一遍又一遍地编写相同的 try 和 catch,这是重复的代码。

也许有一本书解释了如何设计一个带有异常处理的大型应用程序?

4

2 回答 2

4

当你调用一个方法时,你不一定要在那里捕获异常。你可以让你的调用者处理它们(如果它是一个检查异常,则声明一个 throws 子句)。事实上,无需任何额外工作即可将它们传递给调用者的能力是异常的显着特征。

My team has adopted the following coding standard: We throw checked exceptions for those rare cases when we want to recover from a failure, and unchecked exceptions for anything else. There is only a single catch block for the unchecked exceptions in a method so high in the call stack that all requests pass through it (for instance in a ServletFilter). This catch block logs the exception, and forwards the user to the "Sorry, this shouldn't have happened" page.

于 2012-08-16T20:21:46.717 回答
3

您是否查看过代码以检查为什么抛出所有这些异常?例外是有原因的——告诉你出了点问题。如果您正在编写太多“样板”try-catch代码并且您不在千行应用程序中,那么您必须重构。

try-catch当你有一个复杂的块并且可能变得非常单调和样板时可能会很烦人(Marc Gravell 甚至说他经常使用try-finally)但作为一个新程序员,检查你编写的代码并弄清楚如何处理或避免这些异常。

正如 akf 所提到的,忽略异常也可能对调试有害。如果您遗漏了导致灾难性的异常,则将更难追踪灾难性错误的地方。

于 2012-08-16T20:09:28.333 回答