#!/usr/local/bin/pike// -*- mode: pike -*-
// $Id: except.pike,v 1.2 2000/12/05 16:04:06 doug Exp $
// http://www.bagley.org/~doug/shootout/
// from: Per Hedbor
// this version requires Pike 7.1
class HiException( mixed value ) { constant IsHi = 1; }
class LoException( mixed value ) { constant IsLo = 1; }
void some_function( int num )
{
if( mixed e = catch( hi_function( num ) ) )
error( "We shouldn't get here (%s)", describe_error( e ) );
}
int HI, LO;
void hi_function(int num)
{
if( mixed e = catch( lo_function( num ) ) )
if( e->IsHi )
HI++;
else
throw( e );
}
void lo_function(int num)
{
if( mixed e = catch( blowup(num) ) )
if( e->IsLo )
LO++;
else
throw( e );
}
void blowup(int num)
{
if( num & 1 )
throw( LoException(num) );
else
throw( HiException(num) );
}
void main(int argc, array argv)
{
int num = (int)argv[-1];
if( num < 1 )
num = 1;
while(num)
some_function( num-- );
write( "Exceptions: HI=%d / LO=%d\n" , HI, LO );
}