On 18 Sep 2014 at 19:41:56, [email protected] 
([email protected](mailto:[email protected])) wrote:

> 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. 

I’ve now implemented a directive and it’s so cool :)

It’s so simple compared to what I had, I love it.

Here’s the usage code now:

#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
#end
…
  <div id="xwikicontent">
    #if ("$!exception" != '')
      #displayException($exception)
    #else
      $renderedContent
    #end
  </div>
…

I like it so much that I’m going to commit it and if someone doesn’t agree I’ll 
revert the commit :)

Thanks Sergiu
-Vincent

> > 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 = "
$escapetool.html($tdoc.getRenderedContent($outputSyntax))
")
> #end
> #else
> #set ($renderedContent = $tdoc.getRenderedContent())
> #end
> #catch()
>  
> …
>

> #if ("$!exception" != '')
> #displayException($exception)
> #else
> $renderedContent
> #end
>

> …
>  
>  
> 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