Hi Sergiu, 

On 18 Sep 2014 at 19:29:52, Sergiu Dumitriu 
([email protected](mailto:[email protected])) wrote:

> 1. I would rather add proper directives instead of macros and
> uberspector hacks: http://stackoverflow.com/q/159292/620249

Argh… I wanted that and I asked Thomas and he told me it wasn’t possible and I 
didn’t double check. I should have since I’ve now finished my implementation 
and redoing it as a directive means dumping what I’ve done a third time in the 
end. Anyway I agree that a directive is better so I’ll redo it.

> 2. So far it has been the job of our scriptable wrappers to catch
> exceptions, does this proposal mean that:
> a. We should stop doing that and write try-catch logic in our
> templates/scripts? IOW, catching exceptions in wrappers is a bad design
> pattern?

I’ve not answered this question because I don’t know yet. I think we’ll 
discover that as we start using the new try/catch. ATM I’m only planning to use 
it in contentview.vm.

> b. We didn't do that enough, and as a workaround we're adding exception
> handling in Velocity?

Yes, that’s true. We now have both cases in our code (code throwing exceptions, 
like a lot of methods in Document, XWiki) and others catching exceptions.

This proposals offers a finer-grained control in vm while not breaking backward 
compatibility. Any change in our script APIs would break compatibility (this is 
what I started doing before realizing it would break too many things)…

FTR here’s what I have so far in term of usage, in contentview.vm:

#try()
  #set($outputSyntax = $xwiki.getAvailableRendererSyntax($request.outputSyntax, 
$request.outputSyntaxVersion))
  #if ($outputSyntax)
    ## If the passed syntax is not an HTML-compatible syntax we need to 
HTML-escape it so that it can be
    ## displayed fine in HTML (since at the point this vm file is called we're 
already inside an HTML page with
    ## panels on the side, header, etc).
    #set($syntaxType = $outputSyntax.type.toIdString())
    #if (($syntaxType == "xhtml") || ($syntaxType == "html"))
      #set ($renderedContent = $tdoc.getRenderedContent($outputSyntax))
    #else
      ## Make sure to print correctly the result when it's not HTML
      #set ($renderedContent = 
"<pre>$escapetool.html($tdoc.getRenderedContent($outputSyntax))</pre>")
    #end
  #else
    #set ($renderedContent = $tdoc.getRenderedContent())
  #end
#catch()
…
  <div id="xwikicontent">
    #if ("$!exception" != '')
      #displayException($exception)
    #else
      $renderedContent
    #end
  </div>
…

Thanks
-Vincent

> On 09/18/2014 09:28 AM, [email protected] wrote:
> > Hi Devs,
> >
> > Example of a use case:
> >
> > * In contentview.vm we need to be able to catch when getRenderedContent() 
> > throws an exception in order to be able to still display the page title, 
> > content menu and last modification line. We want only the content part to 
> > display an error.
> >
> > I’ve tried implementing the following:
> > * Modified Document.getRenderedContent() to not throw exceptions any more
> > * I’ve added Document.setError() and getError()
> > * Then added a #displayRenderedContent($renderedContent) velocimacro to 
> > display an error, calling Document.getError()
> >
> > However that’s no good because we have lots of places in our code (and in 
> > extensions we don’t control) that call getRenderedContent() and they expect 
> > the whole page rendering to fail in case of an error…
> >
> > Thus after discussing quickly on IRC and with Thomas we’d like to propose 
> > instead:
> >
> > * Add a new #try() velocimacro that would push a new empty List in the 
> > Execution Context to a Stack variable
> > * Add a new uberspector that would, based on this flag do a try/catch 
> > around the method called (can be done easily by returning a custom 
> > VelMethod)
> > * The uberspector catch would add the exception to the List in the 
> > Execution Context
> > * Add a new #catch() velocimacro that would pop from the Stack in the 
> > Execution Context and that would set 2 variables in the Velocity Context:
> > ** $exception: the first exception
> > ** $exceptions: the list of all exceptions that happened between the #try() 
> > and #catch()
> >
> > The good part with this is:
> > * No change in behavior to all existing code
> > * Code that want to do something in case of error can do it using 
> > #try()/#catch() for java methods throwing exceptions (like 
> > getRenderedContent())
> >
> > Of course for the future we would need to decide if script services should 
> > stop doing try/catch or not but that’s another debate I’d prefer to 
> > separate from this thread.
> >
> > WDYT?
> >
> > Thanks
> > -Vincent
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to