2013-02-18 67 views
2

在我的项目中,我使用LoadableDetachableModel如下所示。Wicket LoadableDetachableModel异常处理问题

public ReportPage(final Objectm, final PageReference pr) throws CustomException{ 
try{ 
final LoadableDetachableModel<List<MaintReport>> ldm = 
     new LoadableDetachableModel<List<MaintReport>>() { 

      @Override 
      protected List<MaintReport>load() { 
       **// Some Database operations //** 
       return x; 
      } 
     }; 

/* 
Several LoadableDetachableModels, PageableListViews, Panels, Fragments etc. 
*/ 
} catch (Exception ex){ 
// create Custom Exception 
} finally { 
// Clean up of stuff 
} 

的问题是压倒一切的功能load() invoolves一些数据库操作。如果从此方法抛出异常或由此方法引发异常,我可以在哪里捕获? 。看来我无法赶上。当我编写一些日志消息时,我发现在整个构造器执行之后调用方法。
我可以绝对地将数据库操作移出load()方法。但是有没有办法做到这一点?

如果有人遇到过这种情况,如果您可以分享这些信息,那将会很棒。

回答

3

这不是异常处理的工作方式。您需要在LDM中执行异常处理。将你的一些数据库操作包装在try-catch语句中。

+0

是的,我试过了,但load()方法不能抛出Exception。抽象类定义不允许抛出。但是我希望整个构造函数在负载方法失败时抛出异常。 – Jay 2013-02-18 16:11:44

+3

您可以抛出任何RuntimeException并注册一个对您的异常作出反应的RequestCycleListener。 – 2013-02-18 16:17:54

+0

所以这意味着不可能从这个方法中抛出一个检查的异常。是的,RuntimeException和使用RequestCycleListener是我最糟糕的计划。反正谢谢。 – Jay 2013-02-18 16:23:59

3

该代码只定义了load()方法,并没有调用它,所以它引发的任何异常都不会在此try-catch中被捕获。

LoadableDetachableModelload()方法通常被称为仅是getObject()方法LoadableDetachableModel还规定,它是由您的应用程序和Wicket框架本身其他地方调用。

您应该在load()方法本身内部尝试一下,以处理数据库访问可能做的任何异常。如果在该方法中无法处理异常,则可以抛出包装异常的WicketRuntimeException,这通常会导致出现错误页面。

处理该方法以外的数据库错误将是痛苦的。对另一个答案的评论提示你如何继续。

+0

通过调用'new ReportPage()'创建新的ReportPage时,会调用'load()'方法。但是,当我查看日志文件时,看起来'load()'方法是在构造函数中的最后一行代码之后执行的。这正是我的问题。我试图阻止加载页面。了解如何触发'load()'方法将有效地理解处理错误。 – Jay 2013-02-19 09:26:23