Re: strong typing and error handling

new topic     » goto parent     » topic index » view thread      » older message » newer message

On Fri, 27 Jun 2003 07:55:08 +0000 (06/27/03 17:55:08)
, Peter Willems <peter at integratedmoves.com> wrote:

>
>
> Maybe I'm shooting myself in the foot here, but....
>
> One of the things in Eu that I really like is the rule-like
> variable typing that let us set boundaries for a variable.
> But it seems to me that the absense of an error-handler makes
> this close to useless because when I try to load a value into
> a variable that is outside it's boundaries, it exits the app
> with an error message. Thus I need to have my app check anyway
> when putting values into vars to prevent my app from exiting,
> so when I have to check var boundaries myself, what does the
> option to set boundaries when defining a var does for me ?
>
> Or do I mis something and IS it possible to capture boundary
> overflow (or underflow) in a simple way so I can write a simpe
> error-handler ?
>

You can almost do this, so long as you don't mind not having access to any 
meta-data.

 procedure logerr(sequence msg, object data)
   printf(2, "Type Failure: %s\n", {msg})
   pretty_print(2, data, {3})
 end procedure

 global type Customer(object x)

  if not sequence(x) then
	logerr("Customer Type must be a sequence.", x)
      return 1 -- Return to app
  end if

  if length(x) != 5 then
	logerr("Customer Type must have 5 fields.", x)
      return 1 -- Return to app
  end if

  ...etc...

  return 1
 end type


So long as you always return non-zero from a type definition, your 
application won't crash with a 'type' error.

If you don't mind it crashing when an assignment is made you do this...

 sequence vTypeDefCrash
 vTypeDefCrash = {0}

 procedure SetTypeDefCrash( object NewVal)
  if sequence(NewVal) then
    if length(vTypeDefCrash) > 1 then
       vTypeDefCrash = vTypeDefCrash[2..length(vTypeDefCrash)]
       return
    end if  else
    vTypeDefCrash = NewVal & vTypeDefCrash
  end if
 end procedure

 global type Customer(object x)

  if not sequence(x) then
	logerr("Customer Type must be a sequence.", x)
      return vTypeDefCrash[1]
  end if

  if length(x) != 5 then
	logerr("Customer Type must have 5 fields.", x)
      return vTypeDefCrash[1]
  end if

  ...etc...

  return 1
 end type
 So that by default it would crash except when you don't want it to crash 
during a certain part of you code...

  SetTypeDefCrash(1) -- Turn on crash avoidance
  . . . -- critical code
  SetTypeDefCrash("") -- Restore it to whatever it was.

Unfortunately, you can't tell the user what line of code this was on, or 
the name of the variable, or even what source file it was in. --

cheers,
Derek Parnell

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu