Re: How to stop (w/o exception)
"Jonathan Revusky" <[email protected]>
| Newsgroups | gmane.comp.web.freemarker.user |
|---|---|
| Message-ID | <[email protected]> |
Oh, it appears that the stop.getMessage() is not returning the string
"graceful", so it's rethrowing. The constructor is putting a bunch of
extra info in the message string as well as the cause you added.
So that would probably work if it was:
if (stop.getMessage().find("graceful") == -1) throw stop;
Then as long as the string "graceful" appears in the message, it
simply ends gracefully, otherwise it rethrows.
JR
On Tue, Feb 26, 2008 at 7:39 PM, Newman, John W <[email protected]> wrote:
> catch (StopException stop) {
> if !("graceful".equals(stop.getMessage()) throw stop;
> }
>
> That's where I am going, but FreemarkerServlet doesn't really give me a clear point to hook in. This class could probably use a few simple refactorings like extract method and such at some point. Some of the methods look like they are doing 6 different things.
>
> Pre template process can do it, but the exception handling doesn't really work out...
>
> @Override
> public boolean preTemplateProcess(HttpServletRequest request,
> HttpServletResponse response, Template template, TemplateModel model) {
> addMyStuffToModel();
> try {
> process(request, response, template, model);
> } catch (TemplateException e) {
> handleException(e);
> } catch (IOException e) {
> handleException(e);
> } catch (ServletException e) {
> handleException(e);
> }
> return false;
> }
>
> // servlet should have this as a protected method,
> // I could then just call super.process(..) in a try catch block.
> protected void process(HttpServletRequest request,
> HttpServletResponse response, Template template, TemplateModel model)
> throws TemplateException, IOException, ServletException {
> try {
> template.process(model, response.getWriter());
> } catch (StopException e) {
> if (!"graceful".equals(e.getMessage())) {
> throw e;
> }
> } finally {
> postTemplateProcess(request, response, template, model);
> }
> }
>
>
> protected void handleException(Exception e) {
> LOG.error(e.getMessage(), e);
> // uh...
> }
>
>
>
> Also it looks like that won't work anyway, the exception doesn't come back and I can't catch it... Am I doing something wrong?
>
>
> 13:32:22,530 ERROR runtime:96 -
> Encountered stop instruction
>
> Cause given: graceful
> graceful
> The problematic instruction:
> ----------
> ==> stop [on line 4, column 9 in WEB-INF/inquiry/view.ftl] [on line 4, column 9 in WEB-INF/inquiry/view.ftl]
> in include "view.ftl" [on line 11, column 9 in WEB-INF/inquiry/index.ftl]
> ----------
>
> Java backtrace for programmers:
> ----------
> freemarker.core.StopException: graceful
> at freemarker.core.StopInstruction.accept(StopInstruction.java:73)
> at freemarker.core.Environment.visit(Environment.java:196)
> at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:79)
> at freemarker.core.Environment.visit(Environment.java:196)
> at freemarker.core.MixedContent.accept(MixedContent.java:92)
> at freemarker.core.Environment.visit(Environment.java:196)
> at freemarker.core.Environment.include(Environment.java:1378)
> at freemarker.core.Include.accept(Include.java:155)
> at freemarker.core.Environment.visit(Environment.java:196)
> at freemarker.core.MixedContent.accept(MixedContent.java:92)
> at freemarker.core.Environment.visit(Environment.java:196)
> at freemarker.core.Environment.process(Environment.java:176)
> at freemarker.template.Template.process(Template.java:232)
> at edu.upmc.ccweb.core.support.freemarker.FreemarkerServlet.process(FreemarkerServlet.java:168)
> at edu.upmc.ccweb.core.support.freemarker.FreemarkerServlet.preTemplateProcess(FreemarkerServlet.java:152)
> at freemarker.ext.servlet.FreemarkerServlet.process(FreemarkerServlet.java:424)
> at freemarker.ext.servlet.FreemarkerServlet.doGet(FreemarkerServlet.java:366)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
>
>
>
>
>
> -----Original Message-----
> From: [email protected] [mailto:[email protected]] On Behalf Of Jonathan Revusky
> Sent: Tuesday, February 26, 2008 1:03 PM
> To: FreeMarker-user
> Subject: Re: [FreeMarker-user] How to stop (w/o exception)
>
> On Tue, Feb 26, 2008 at 6:48 PM, Newman, John W <[email protected]> wrote:
> > Instead of the macro I'd just put it in an if statement. Maybe I can try/catch stop exception in my servlet, but I may not always want to catch that. There should be a [#abort /] directive or something to do that.
>
> Well, one possibility is that you use [#stop "graceful"] when you
> intend for the exception to be ignored. And then in the java code, you
> could:
>
> try {
> ....
> template.process(dataModel,out);
> ...
> } catch (StopException stop) {
> if !("graceful".equals(stop.getMessage()) throw stop;
> }
>
> so you rethrow the exception unless the detail string associated with
> it is "graceful".
>
> In any case, Attila's suggestion of using a macro in conjunction with
> #return also works internally by throwing an exception except that it
> gets caught , so it unwinds to the point where the macro was called.
> You know, again, AFAICS, the only way to jump out of an arbitrarilly
> nested structure is by throwing an exception.
>
>
> >
> >
> >
> >
> > -----Original Message-----
> > From: [email protected] [mailto:[email protected]] On Behalf Of Attila Szegedi
> > Sent: Tuesday, February 26, 2008 12:44 PM
> > To: FreeMarker-user
> > Subject: Re: [FreeMarker-user] How to stop (w/o exception)
> >
> > You could enclose your template body in a:
> >
> > [#macro actuallyRenderThePage]
> > ...
> > [/#macro]
> > [@actuallyRenderThePage/]
> >
> > and then use [#return] from within the macro body. Of course, that
> > doesn't address more complex situations, as stopping gracefully from
> > several levels of macros or includes. In these cases [#stop/] is the
> > only reliable mechanism -- you'll just have to catch and ignore it at
> > your point of Template.process() invocation...
> >
> > Attila.
> >
> > On 2008.02.26., at 17:44, Newman, John W wrote:
> >
> > > Hi,
> > >
> > > I tried searching but sourceforge is down... I'm sure this has been
> > > discussed before.
> > >
> > >
> > > We have the [#stop /] directive which throws an exception. Is there
> > > a way to stop processing gracefully?
> > >
> > >
> > > [#if somethingBad]
> > > [#stopGracefully /]
> > > [/#if]
> > >
> > > Sure I could do
> > >
> > > [#if ! somethingBad]
> > > Everything here
> > > [/#if]
> > >
> > > But I'm pretty sure there is a break or stop thing that should work
> > > here. Just wondering, thanks.
> >
> >
> >
> >
> >
> >
> > -------------------------------------------------------------------------
> > This SF.net email is sponsored by: Microsoft
> > Defy all challenges. Microsoft(R) Visual Studio 2008.
> > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
> > _______________________________________________
> > FreeMarker-user mailing list
> > [email protected]
> > https://lists.sourceforge.net/lists/listinfo/freemarker-user
> >
> > -------------------------------------------------------------------------
> > This SF.net email is sponsored by: Microsoft
> > Defy all challenges. Microsoft(R) Visual Studio 2008.
> > http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
> > _______________________________________________
> > FreeMarker-user mailing list
> > [email protected]
> > https://lists.sourceforge.net/lists/listinfo/freemarker-user
> >
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Microsoft
> Defy all challenges. Microsoft(R) Visual Studio 2008.
> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
> _______________________________________________
> FreeMarker-user mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/freemarker-user
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Microsoft
> Defy all challenges. Microsoft(R) Visual Studio 2008.
> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
> _______________________________________________
> FreeMarker-user mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/freemarker-user
>
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/