Annotation of 43BSD/contrib/xns/doc/except.n, revision 1.1

1.1     ! root        1: .TH EXCEPT 3 Stanford
        !             2: .SH NAME
        !             3: (except) raise, raise_sys() \- C exception handling
        !             4: .SH SYNOPSIS
        !             5: .B #include <xnscourier/except.h>
        !             6: .sp
        !             7: .B raise(code, msg)
        !             8: .br
        !             9: .B int code;
        !            10: .br
        !            11: .B char *msg;
        !            12: .sp
        !            13: .B raise_sys()
        !            14: .sp
        !            15: cc ... \-lexcept
        !            16: .SH "EXTENDED C SYNTAX"
        !            17: .B DURING
        !            18: statement1
        !            19: .B HANDLER
        !            20: statement2
        !            21: .B END_HANDLER
        !            22: .sp
        !            23: .B E_RETURN(
        !            24: expression
        !            25: .B )
        !            26: .sp
        !            27: .B E_RETURN_VOID
        !            28: .SH DESCRIPTION
        !            29: The macros and functions in this package provide a limited amount
        !            30: of exception handling for programming in C.  They provide the
        !            31: ability to associate an exception handler to be invoked if an
        !            32: exception is raised during the execution of a statement.
        !            33: .PP
        !            34: C syntax is extended by several macros that allow the programmer
        !            35: to associate an exception handler with a statement.  The ``syntax''
        !            36: for this is:
        !            37: .sp
        !            38: .nf
        !            39: DURING statement1 HANDLER statement2 END_HANDLER
        !            40: .fi
        !            41: .sp
        !            42: Either or both statement may be a compound statement.
        !            43: If an exception is raised using the
        !            44: .IR raise ()
        !            45: function during
        !            46: .I statement1
        !            47: (or during any functions called by
        !            48: .IR statement1 ),
        !            49: the stack will be unwound and
        !            50: .I statement2
        !            51: will be invoked in the current context.  However, if the exception
        !            52: handler is redeclared in a
        !            53: .I dynamically
        !            54: enclosed statement, the current exception handler will be inactive during
        !            55: the execution of the enclosed statement.
        !            56: .PP
        !            57: During the execution of
        !            58: .IR statement2 ,
        !            59: two predefined values may be used:
        !            60: .IR Exception.Code ,
        !            61: an integer, is the value of
        !            62: .I code
        !            63: passed to the 
        !            64: .IR raise ()
        !            65: call which invoked the handler, and
        !            66: .IR Exception.Message
        !            67: is the value of
        !            68: .IR msg .
        !            69: It is up to the user to define the values used for the exception
        !            70: codes; by convention, small positive integers are interpreted
        !            71: as Unix error codes.
        !            72: .PP
        !            73: As an example of the use of this package, the following ``toy'' code
        !            74: computes the quotient of variables f1 and f2, unless f2 is 0.0:
        !            75: .sp
        !            76: .nf
        !            77:        DURING {
        !            78:            if (f2 == 0.0)
        !            79:                raise(DIVIDE_BY_ZERO, "Division by zero attempted");
        !            80:            quotient = f1/ f2;
        !            81:        } HANDLER
        !            82:            switch (Exception.Code) {
        !            83:            case DIVIDE_BY_ZERO:
        !            84:                return(HUGE);
        !            85:                break;
        !            86:            default:
        !            87:                printf("Unexpected error %s\\n", Exception.Message);
        !            88:            }
        !            89:        END_HANDLER
        !            90: .fi
        !            91: .PP
        !            92: If a handler does not want to take responsibility for an exception,
        !            93: it can ``pass the buck'' to the dynamically enclosing exception
        !            94: handler by use of the
        !            95: .I RERAISE
        !            96: macro, which simply raises the exception that invoked the handler.
        !            97: Of course, it is possible that there is no higher-level handler.
        !            98: The programmer can control the action in this case by setting the
        !            99: external int
        !           100: .I ExceptMode
        !           101: to some (bit-wise OR'd) combination of the following constants:
        !           102: .IP "EX_MODE_REPORT" 1.5i
        !           103: Print a message on stderr if an exception is not caught.  If this
        !           104: is not set, no message is printed.
        !           105: .IP "EX_MODE_ABORT" 1.5i
        !           106: Calls the
        !           107: .IR abort (3)
        !           108: routine if an exception is not caught.  If this is not set,
        !           109: .IR exit (3)
        !           110: is called, with the exception code as an argument.
        !           111: .PP
        !           112: The default value for
        !           113: .I ExceptMode
        !           114: is zero.
        !           115: .SH RESTRICTIONS
        !           116: .B THESE RESTRICTIONS ARE IMPORTANT;
        !           117: YOU WILL SUFFER IF YOU DISOBEY THEM.
        !           118: .PP
        !           119: During the execution of
        !           120: .IR statement1,
        !           121: no transfers out of the statement are allowed, except as noted here.
        !           122: Execution of a compound
        !           123: .I statement1 
        !           124: must ``run off the end'' of the block.  This means that
        !           125: .I statement1
        !           126: may not include a
        !           127: .B return
        !           128: or
        !           129: .BR goto ,
        !           130: or a
        !           131: .B break
        !           132: or
        !           133: .B continue
        !           134: that would affect a loop enclosing the
        !           135: .I DURING ... END_HANDLER
        !           136: block.  The
        !           137: .I statement1
        !           138: may include a call to
        !           139: .IR raise ()
        !           140: (but not
        !           141: .IR RERAISE ),
        !           142: .IR exit (3),
        !           143: and any statement at all may be used in a function called.
        !           144: .PP
        !           145: If you wish to use a
        !           146: .B return
        !           147: within
        !           148: .IR statement1 ,
        !           149: you must instead use
        !           150: .I E_RETURN()
        !           151: to return a value,
        !           152: or
        !           153: .I E_RETURN_VOID
        !           154: if the enclosing function is declared
        !           155: .BR void .
        !           156: These two macros may be used
        !           157: .I only
        !           158: in the (lexically) outermost
        !           159: .I statement1
        !           160: of a function, and nowhere else.
        !           161: .PP
        !           162: There are no restrictions on what may be done inside the
        !           163: .I statement2
        !           164: part of a handler block, except that it is subject to the
        !           165: above constraints if it is lexically enclosed in the
        !           166: .I statement1
        !           167: part of another handler.
        !           168: .PP
        !           169: As an aid to Unix programmers, the
        !           170: .IR raise_sys ()
        !           171: function is provided.  It is used exactly as
        !           172: .IR raise ()
        !           173: is, except that it uses the global
        !           174: .IR errno (3)
        !           175: to produce the exception code and message.
        !           176: .SH SEE ALSO
        !           177: errno(3), setjmp(3)
        !           178: .SH AUTHOR
        !           179: Jeffrey Mogul (Stanford)
        !           180: .SH BUGS
        !           181: Due to a limitation of the
        !           182: .IR setjmp (3)
        !           183: implementation,
        !           184: .B register
        !           185: variables which are actually stored in registers (and this is not
        !           186: always easy to determine, and especially is not portable) are restored
        !           187: to the values they had upon entering
        !           188: .I statement1
        !           189: when the handler
        !           190: .RI ( statement2 )
        !           191: is invoked.  All other data keeps whatever values they were assigned
        !           192: during the (interrupted) execution of
        !           193: .IR statement1 .
        !           194: A good rule to follow is that you should not rely on the values of
        !           195: variables declared
        !           196: .B register
        !           197: (in the current block) after an exception has been caught.
        !           198: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.