【问题标题】:Exceptions in JavaJava 中的异常
【发布时间】:2012-08-13 05:55:32
【问题描述】:

目前我正在使用 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,这是重复的代码。

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

【问题讨论】:

  • 关于什么的提示、提示或资源? Web 应用程序应该优雅地处理异常(如果您不需要终止)。
  • 我不确定您使用的是哪个 IDE,但是如果您使用的是 eclipse,您也可以使用“代码模板”来帮助加快工作速度。通常,如果可能,您希望尽量避免重复代码,但在某些情况下您不能这样做,代码模板可以帮助加快流程。

标签: java exception web-applications


【解决方案1】:

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

我的团队采用了以下编码标准:当我们想要从故障中恢复时,我们会为那些罕见的情况抛出检查异常,而对于其他任何情况,我们都会抛出未经检查的异常。对于调用堆栈中如此高的方法中的未检查异常只有一个 catch 块,以至于所有请求都通过它(例如在ServletFilter 中)。此 catch 块记录异常,并将用户转发到“抱歉,这不应该发生”页面。

【讨论】:

  • +1 获得使用异常屏障的建议。旁注:这种方法确实涉及一个样板 try { ... } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new RuntimeException(e); } 围绕任何声明检查异常的代码。
  • 哦...是的,我很愚蠢。如果我可以将它们传递给更高的实例,我只需要捕获它们一次。是的,这更有意义。
  • Maik,这就是异常机制的美妙之处。事实上,这正是它首先存在的原因,而不是像 C 那样通过返回值传递错误信息。检查异常造成的说教损害,迫使粗心的开发人员当场处理异常,这真是太可惜了,通常以错误的方式。
【解决方案2】:

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

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

正如 akf 所提到的,忽略异常也可能对调试造成危险。如果您遗漏了导致灾难性事件的异常,则将更难追踪灾难性错误的位置。

【讨论】:

  • 我要补充一点,简单地忽略异常是非常糟糕的做法。您至少应该将其打印到日志中,否则您的代码将无法找到真正的问题
  • @akf 谢谢,我在答案中添加了一部分以反映这一点。
  • 我更新了我的帖子。目前我只捕捉到一般异常。然后我记录了所有这些异常,但这仍然是重复的代码
  • @MaikKlein:捕获可恢复的特定异常并适当处理它们。不要捕获一般异常并继续前进,就好像什么都没发生一样。
  • @MaikKlein 如果您要进行数据库连接调用每个函数,我会将错误处理下推到该函数并在那里优雅地退出。如果没有,那么您可以让您的应用程序因数据库连接失败而死掉,或者捕获它并显示错误消息。
猜你喜欢
  • 2016-01-08
  • 2021-04-07
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多