Hi,
I'd like to tackle the error rendering part of the new rendering module.
Right now there are several locations where the rendering can fail:
* a Macro can fail to be located
* a Macro can fail during execution
* a link can fail to be resolved. For example if the access to the
database fails when looking up the document corresponding to the link
name. Or if the link has an invalid format.
WikiModel will normally not generate any exception while parsing so we
shouldn't have any exception to handle there. Haven't checked Doxia
yet on this.
In any case I see 2 options to handle the cases listed above:
Solution 1: Generate an ErrorBlock
===========================
This means replacing the original block (MacroBlock or LinkBlock) by
an ErrorBlock which will then get rendered accordingly (with some kind
of error box in the XHTML renderer for example).
Pros: Shows exactly where the problem is in the document and render
the rest of the document.
Cons: It's possible to overlook the fact that there's a rendering
error since it doesn't blow up when an error happens
Solution 2: Fail the rendering process with an exception
===========================================
We'll then need some error handling code in XWiki to handle exceptions
thrown by the XDOM.traverse() method.
Pros: Not possible to avoid the fact that there's an error in the
document somewhere
Cons: Makes rendering process more "fragile" and possibly make it
harder to find out where the problem is located. Note that to
alleviate this we would need to implement some code to tell the user
where the problem happened exactly in the code (this could be done by
adding some offset/length attributes to the Blocks).
Personally I'm still hesitating but I think maybe the best would be to
combine both solutions, i.e. do the following:
* Generate the rendered document with rendered ErrorBlocks
* Throw an exception which contains the rendered document, thus
allowing the error handling the ability display the rendered document
with its errors displayed inline.
WDYT?
Thanks
-Vincent