Application Designer binds its page processing to adapter objects providing properties and methods - as explained in the previous sections. What happens if an error happens at runtime, e.g. an error occurs in the method of an adapter object that is called after the user pressed a button?
This document covers the following topics:
The first rule is: normal exceptions (i.e. no "Errors", no "Runtime Exceptions") are to be handled by the application itself.
This means: a property is provided by the corresponding set/get methods (or by an equivalent method when using dynamic binding). The methods must not throw any exception, i.e. in their declarations there is no "throws" element.
Example for a correct implementation:
public void setFirstName(String value) { ... ... } public String getFirstName() { ... ... }
The following example is an incorrect implementation because application exceptions are thrown:
public void setFirstName(String value) throws ApplException { ... ... } public String getFirstName() throws ApplException { ... ... }
Consequence: Application Designer passes values from the browser front end into the adapter object, invokes certain activities inside this object and collects data from the object to pass data changes back to the browser. Application exceptions are not relevant from Application Designer's point of view - they only affect the application internally.
Of course your application still can throw "Error" exceptions or "Runtime" exceptions. These are the exceptions that need not be declared inside a method's code - but that can be thrown any time at any place.
If Application Designer receives an error or runtime exception, Application Designer displays a page by default in which the error information is shown.
In addition, Application Designer writes a full stack dump into its runtime log.
There may be some situations - within a special environment
context - that do not allow to process the page at all. Maybe you have a page
that requires a user to be logged on; if the Application Designer request processing starts
now, you may decide with the method
reactOnDataCollectionStart
that you do not want to
start the request since it does not make sense at all and just causes
exceptions.
The only thing you want to do in such a scenario is to "escape" to a page which helps out of the situation. For example, if you miss logon information, you want to "escape" to the logon page and return to your original page afterwards.
The Java error class
AdapterNotAvailableError
is provided for this reason.
The following adapter code shows an example on how to handle this error:
package com.softwareag.cis.demoapps; ... ... public class Rescue1Adapter extends Adapter { ... ... /** start of data transfer */ public void reactOnDataTransferStart() { super.reactOnDataTransferStart(); // fetch user and sytem info from session context m_user = (String)findSessionContext().lookup("rescueexample/user",false); m_system = (String)findSessionContext().lookup("rescueexample/system",false); // if not logged on ==> switch to rescue2 page if (m_user == null || m_system == null) { // prepare Rescue2 page Rescue2Adapter r2a = (Rescue2Adapter)findAdapter(Rescue2Adapter.class); r2a.init("Rescue1.html"); // throw error in order to interrupt normal processing and switch // to Rescue2 page throw new AdapterNotAvailableError("Rescue2.html"); } } ... ... }
Inside the reactOnDataTransferStart
method, a user and a system variable are read from the session context. If one
of them is null, the adapter decides to switch to page
Rescue2.html and throws an
AdapterNotAvailableError
error. Before, it pre-fetches
the page adapter of the page to escape to and initializes the page with certain
information (in this example, it passes its own page name).
The error page is opened inside the same subsession as the one throwing the error.
There is a set of methods available in the adapter with which you can influence the standard error behavior:
handleErrorDuringInitPhase()
handleErrorDuringSetPhase()
handleErrorDuringInvokePhase()
handleErrorDuringGetPhase()
Depending on the method you have the following possibilities:
handleErrorDuringInitPhase()
This method is called when an error occurs in the
init
method of the adapter.
handleErrorDuringSetPhase() and
handleErrorDuringGetPhase()
These methods are called when an error occurs during the set
and the get phase of the adapter request processing.
You may throw an
AdapterNotAvailableError
to navigate to a page of your
own in order to present to the user detailed error information - and maybe also
some way to solve the error.
handleErrorDuringInvokePhase()
This method is called when an error occurs during the invoke
phase of the adapter request processing.
You can decide whether normal Application Designer runtime processing
continues, whether you want to navigate to an error handling page (via
PageNotAvailableError
), or whether the standard error processing
of Application Designer is done.
See the API documentation (Java Doc) for further details.