[Seaside] Ajax and error management

Johan Brichau johan at inceptive.be
Sat May 14 18:19:30 UTC 2011


Exceptions in Seaside are handled by an instance of (a subclass of) WAExceptionHandler. Setting the exception handler is part of the application configuration.
For development, Seaside provides you with exception handlers (e.g. WAWalkbackErrorHandler) that return an exception page and that can open a debugger on the server-side (or they put a continuation on the objectlog in GLASS). 
However, the problem with AJAX calls is that the browser will not render that response as a page refresh. Gracefully dealing with those exceptions requires a bit of javascripting. In addition, if you want to handle exceptions differently on the server-side, you need to implement your own subclass of WAExceptionHandler (or any of its subclasses).

For handling ajax errors differently on the client side (for example, refreshing the page anyway): provide a javascript function as the 'onError' parameter for the ajax call. You can do this for each ajax call separately, or you can define a global handler. 
Some examples:
- http://stackoverflow.com/questions/377644/jquery-ajax-error-handling-show-custom-exception-messages
- http://api.jquery.com/ajaxError/

To change the server-side behavior. I think you can find your way by looking at the implementation of the existing handlers.
To give you yet another example, here is the principal code of an error handler we are using in production code. In combination with a global ajax error handler, it makes sure that a decent error message is put on the screen (in a kind of dialog window) whenever an error occurred server-side in an ajax callback.

handleDefault: anException
	[self logErrorToDisk: anException] 
		ensure: [self requestContext respond: [ :response |
									contentType: WAMimeType textHtml;
									nextPutAll: (self rendererClass builder
										fullDocument: true;
										rootBlock: [ :root | root title: anException description ];
										render: [:html | html render:(NPProductionErrorDialog exception: anException)])]]

Hope this gets you on your way!

On 13 May 2011, at 22:50, Thierry Thelliez wrote:

> While I successfully created my first JQuery modal dialog, I
> encountered two issues regarding exception management:
> ===1===  At one point I had a bug in my code (I know, this never
> happens ;-). The component rendering the dialog did not seem to
> respond to user input.  Inspecting with Firebug, I found that the
> server (GLASS) was returning a 505.  But the debugger (Seaside
> Walkback html page) was not displayed.  Now, I understand that this is
> an issue that has to do with Javascript exception handling.  But how
> do you do that in Seaside?
> In other words, the code below works.  But do you have any code
> example on how to manage exception should my 'myComponent' not behave?
> html div
>      id: (html nextId);
>      script: (html jQuery new dialog
>         	html: myComponent;
>         	title: 'Title';
> 	height: 180;
> 	width: 420;
>         	resizable: false;
> 	autoOpen: false;
>         	modal: true).
> html anchor
>      	url: '#';
> 	onClick: (( html jQuery id: html lastId) dialog open );
> 	with: 'Test'
> ===2=== Likewise, I got a 403 when leaving my first calling page
> opened for a while. I mean that attempting to open the above dialog
> does not work anymore after a time that I think is the session
> expiration.  I guess that the link under 'Test' calls
> jquery/javascript, but then the javascript refers to a continuation
> that is expired. (BTW, I am using Seaside 3.0 and GLASS).
> Again, I would like to be able to intercept such exception/error and
> provide something more user friendly.  Right now the dialog opens a
> blank dialog.
> Suggestions?
> Thanks,
> Thierry
> _______________________________________________
> seaside mailing list
> seaside at lists.squeakfoundation.org
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside

More information about the seaside mailing list