#!/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 ); }