Java中的异常

Java中的异常,java,exception,web-applications,Java,Exception,Web Applications,目前,我正在使用Playframework2开发一个网站。我只是一个编程新手。我读过一些关于异常的书,但现在在现实世界中,异常处理真的很奇怪 老实说,我真的不在乎抛出什么异常,我以相同的方式处理所有异常。 返回错误请求。我只在日志记录中使用异常 try{ ... } catch(Exeption e){ //log return badrequest(); } 但这是这么多样板文件,编写起来真的很烦人,因为每个方法都会抛出相同的异常 你能给我一些提示、提示或资源吗 编辑: 例如,我的全局配置文

目前,我正在使用Playframework2开发一个网站。我只是一个编程新手。我读过一些关于异常的书,但现在在现实世界中,异常处理真的很奇怪

老实说,我真的不在乎抛出什么异常,我以相同的方式处理所有异常。 返回错误请求。我只在日志记录中使用异常

try{
...
}
catch(Exeption e){
//log
return badrequest();
}
但这是这么多样板文件,编写起来真的很烦人,因为每个方法都会抛出相同的异常

你能给我一些提示、提示或资源吗

编辑:

例如,我的全局配置文件。因为每次我认为我可以为这个问题编写一个单例时,我都需要连接到db

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时都会尝试捕获。我的问题是我不认为我能胆怯地处理它们

代码示例:

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-and-catch,这是重复的代码


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

你有没有看过你的代码来检查为什么要抛出所有这些异常?例外的存在是有原因的——告诉你出了什么问题。如果您正在编写太多的样板代码,而您不在一个千行应用程序中,那么您必须重构

当您有一个复杂的块时,try-catch可能会让人恼火,可能会变得非常单调和样板,但作为一名新程序员,检查您编写的代码并找出如何处理或避免这些异常会对您有所帮助


正如akf提到的,忽略异常也会对调试造成危害。如果您丢失了导致灾难性错误的异常,那么就很难追踪到哪里出了问题。

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

当您有一个复杂的块时,try-catch可能会让人恼火,可能会变得非常单调和样板,但作为一名新程序员,检查您编写的代码并找出如何处理或避免这些异常会对您有所帮助


正如akf提到的,忽略异常也会对调试造成危害。如果您缺少导致灾难性事件的异常,那么就很难追踪到哪里出了问题。

当您调用一个方法时,您不一定要立即捕获异常。如果throws子句是选中的异常,则可以让调用者处理它们。事实上,将它们传递给调用方而无需任何额外工作的能力是异常的显著特征


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

当调用方法时,不一定要立即捕获异常。如果throws子句是选中的异常,则可以让调用者处理它们。事实上,将它们传递给调用方而无需任何额外工作的能力是异常的显著特征


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

关于具体内容的提示、提示或参考资料?如果您不需要终止,Web应用程序应该优雅地处理异常。我不确定您使用的是哪个IDE,但是如果您使用的是eclipse,您还可以使用代码模板来帮助加快工作。通常情况下,如果可能的话,您希望尽量避免重复代码,但在某些情况下,您不能这样做,并且代码模板可以帮助加快过程。关于具体内容的提示、提示或参考资料?如果您不需要终止,Web应用程序应该优雅地处理异常。我不确定您使用的是哪个IDE,但是如果您使用的是eclipse,您还可以使用代码模板来帮助加快工作。通常,如果可能的话,您希望尽量避免重复代码,但在某些情况下,您不能这样做,代码模板可以帮助sp
加快进程。我想补充一点,简单地忽略异常是非常糟糕的做法。您至少应该将其打印到日志中,否则您将无法通过您的code@akf谢谢,我在回答中添加了一部分来反映这一点。我更新了我的帖子。目前我只知道一般的例外情况。然后我记录所有这些异常,但这仍然是重复的code@MaikKlein:捕获可恢复的特定异常并进行适当处理。不要捕捉一般的异常,继续前进,就好像什么也没发生一样。@MaikKlein如果您正在对每个函数进行数据库连接调用,我会将错误处理向下推到该函数,并在那里优雅地退出。如果没有,那么你可以让你的应用程序因为数据库连接失败而死亡,或者捕获它并显示一条错误消息。您至少应该将其打印到日志中,否则您将无法通过您的code@akf谢谢,我在回答中添加了一部分来反映这一点。我更新了我的帖子。目前我只知道一般的例外情况。然后我记录所有这些异常,但这仍然是重复的code@MaikKlein:捕获可恢复的特定异常并进行适当处理。不要捕捉一般的异常,继续前进,就好像什么也没发生一样。@MaikKlein如果您正在对每个函数进行数据库连接调用,我会将错误处理向下推到该函数,并在那里优雅地退出。如果没有,那么您可以让您的应用程序因为数据库连接失败而死亡,或者捕获它并显示一条错误消息。+1对于使用异常屏障的建议,祝您成功。旁注:这种方法确实涉及到一个样板文件,在任何声明已检查异常的代码周围尝试{…}catch RuntimeException e{throw e;}catch Exception e{throw new RuntimeExceptione;}。。。是的,我很笨。如果我能把它们传给更高的地方,我只需要抓住它们一次。是的,这更有意义。麦克,这就是异常机制的美妙之处。事实上,这正是它首先存在的原因,而不是像C一样通过返回值传递错误信息。检查的异常所造成的教训性损害,迫使粗心大意的开发人员当场处理异常,通常是以错误的方式处理异常,真是太遗憾了。+1表示使用异常屏障的建议,该走了。旁注:这种方法确实涉及到一个样板文件,在任何声明已检查异常的代码周围尝试{…}catch RuntimeException e{throw e;}catch Exception e{throw new RuntimeExceptione;}。。。是的,我很笨。如果我能把它们传给更高的地方,我只需要抓住它们一次。是的,这更有意义。麦克,这就是异常机制的美妙之处。事实上,这正是它首先存在的原因,而不是像C一样通过返回值传递错误信息。检查异常造成的教训性损害,迫使粗心的开发人员当场处理异常,通常是以错误的方式处理异常,这是一件非常遗憾的事。