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

