This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: catching Java exceptions in saxon?


I wrote about this recently in Chapter 17 of Processing XML with 
Java. See 
http://www.cafeconleche.org/books/xmljava/chapters/ch17s03.html#d0e27152

In brief:

If the extension function throws an exception, as calculate() might 
if it's passed a negative number as an argument, then the XSLT 
processing will halt. XSLT has no way to catch and respond to 
exceptions thrown by extension functions. Consequently, if you want 
to handle them, you'll need to handle them in the Java code. After 
catching the exception, you'll want to return something. 
Possibilities include:

* A String containing an error message
* A NodeList containing a fault document
* An integer error code

Since this may not be the same type you normally return, you'll 
probably need to declare that the method returns Object to give you 
the additional flexibility. For example, this method returns an error 
message inside a String instead of throwing an exception:

   public static Object calculate(int n) {

     if (n <= 0) {
      return
       "Fibonacci numbers are only defined for positive integers";
     }
     BigInteger low  = BigInteger.ONE;
     BigInteger high = BigInteger.ONE;
    
     for (int i = 3; i <= n; i++) {
       BigInteger temp = high;
       high = high.add(low);
       low = temp;
     }
    
     return high;

   }

This method returns -1 (an illegal value for a Fibonacci number) 
instead of throwing an exception:

   public static BigInteger calculate(int n) {

     if (n <= 0) return new BigInteger("-1");
     BigInteger low  = BigInteger.ONE;
     BigInteger high = BigInteger.ONE;
    
     for (int i = 3; i <= n; i++) {
       BigInteger temp = high;
       high = high.add(low);
       low = temp;
     }
    
     return high;

   }

It would be up to the stylesheet to check for the error code before 
using the result, and handle such a situation appropriately. In this 
example, that might require calling the extension function before any 
output is generated, storing the result in a variable, and deciding 
whether to output a successful response or a fault document based on 
the value of that variable. Waiting until the template for the int 
element is activated would be too late because by that point 
substantial parts of a successful response document have already been 
generated.
-- 

+-----------------------+------------------------+-------------------+
| Elliotte Rusty Harold | elharo@metalab.unc.edu | Writer/Programmer |
+-----------------------+------------------------+-------------------+
|          The XML Bible, 2nd Edition (Hungry Minds, 2001)           |
|             http://www.cafeconleche.org/books/bible2/              |
|   http://www.amazon.com/exec/obidos/ISBN=0764547607/cafeaulaitA/   |
+----------------------------------+---------------------------------+
|  Read Cafe au Lait for Java News:  http://www.cafeaulait.org/      |
|  Read Cafe con Leche for XML News: http://www.cafeconleche.org/    |
+----------------------------------+---------------------------------+

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]