1. Error Trapping

Hello All,

        A while back I left a message on this list about trapping
errors in euphoria, it seems like someone (Can't seem to remember who)
replied with some source code on how to accomplish the task.

        In some languages there is a Trap() function or On_Error()
function to accomplish what I need, but I can't seem to find the
code that was left or any thing similar.

        Here's the situation, I have a procedure such as:

global procedure My_Procedure(sequence Obj)
      puts(1,"You sent " & Obj & " to My_Procedure")
end procedure

        If the procedure is called like this My_Procedure(buffer)
all is fine, but if it is called like this My_Procedure()

        the program BOMBS with My_Procedure() needs 1 arguments, not 0

I would like to capture this Error and perform and Error Routine, rather
than have the program stop.  This is just a quick example, but I would
like to Trap different kinds of Errors.  If euphoria doesn't have a
function to do this, then MAYBE Rob could add it to the Wish List :)

Thanks in Advance,

+ + +  Rev. Ferlin Scarborough  -  Centreville, Alabama  -  USA

email: ferlin at sandw.net
email: ferlin at email.com

new topic     » topic index » view message » categorize

2. Re: Error Trapping

>>global procedure My_Procedure(sequence Obj)
>>      puts(1,"You sent " & Obj & " to My_Procedure")
>>end procedure

-- You don't need trap

global procedure My_Procedure(sequence Obj)

  -- take some corrective action or return and error condition
  if obj = {} then
    return -1
  end if

  puts(1,"You sent " & Obj & " to My_Procedure")

end procedure

bernie

new topic     » goto parent     » topic index » view message » categorize

3. Re: Error Trapping

Bernie Ryan <bwryan at PCOM.NET> wrote:

>-- You don't need trap
>
>global procedure My_Procedure(sequence Obj)
>
>   -- take some corrective action or return and error condition
>   if obj = {} then
>     return -1
>   end if

I don't think that {} (an empty sequence) is equivalent to no value being
passed to a routine.  It still should bomb out when nothing is passed to it.
Confirmation?

Lewis Townsend


_______________________________________________________________
Get Free Email and Do More On The Web. Visit http://www.msn.com

new topic     » goto parent     » topic index » view message » categorize

4. Re: Error Trapping

Ferlin wrote:

>        In some languages there is a Trap() function or On_Error()
>function to accomplish what I need, but I can't seem to find the
>code that was left or any thing similar.

Well, there *is* a routine which allows you to leave a message on the screen
in the event of an abend -- see LIBRARY.DOC for info on crash_message().
However, I don't believe Euphoria has the error-handling techniques you
describe above.


>        Here's the situation, I have a procedure such as:
>
>global procedure My_Procedure(sequence Obj)
>      puts(1,"You sent " & Obj & " to My_Procedure")
>end procedure
>
>        If the procedure is called like this My_Procedure(buffer)
>all is fine, but if it is called like this My_Procedure()
>
>        the program BOMBS with My_Procedure() needs 1 arguments, not 0
>
>I would like to capture this Error and perform and Error Routine, rather
>than have the program stop.  [snip]

The problem here is that this is a *compile*-time error, not a run-time
error. Euphoria doesn't even let this get past the compile step, since it
"knows" that My_Procedure is supposed to take exactly *one* argument. So you
couldn't trap this error with a routine even if you wanted to.


>This is just a quick example, but I would
>like to Trap different kinds of Errors. [snip]

Perhaps if you gave us more examples describing the other kinds of errors
you'd like to trap for?


Be seeing you,
   Gabriel Boehme


 ------
The way we describe our world shows how we think of our world.
How we think of our world governs how we interpret our world.
How we interpret our world directs how we participate in it.
How we participate in the world shapes the world.

Robert Fripp
 ------

new topic     » goto parent     » topic index » view message » categorize

5. Re: Error Trapping

Bernie Ryan wrote:

[in response to Ferlin's question about calling My_Procedure() with no
arguments]

>>global procedure My_Procedure(sequence Obj)
>>      puts(1,"You sent " & Obj & " to My_Procedure")
>>end procedure
>
> -- You don't need trap
>
>global procedure My_Procedure(sequence Obj)
>
>  -- take some corrective action or return and error condition
>  if obj = {} then
>    return -1
>  end if
>
>  puts(1,"You sent " & Obj & " to My_Procedure")
>
>end procedure

In this example, a call to My_Procedure() with no arguments will not even
get past the compile stage, so your "corrective action" will not have the
effect you intended. The empty sequence {} is *not* equivalent to "no
argument passed" -- Euphoria requires the programmer to specify *all* of a
routine's parameters on each call, even when you're calling them with
call_func() or call_proc().

[ADDITIONAL NITPICKY POINTS: Your "if" statement would result in the
"true/false condition must be an ATOM" error. It should read "if equal(Obj,
{})" or "if compare(Obj, {}) = 0" instead. Also, My_Procedure can't return a
 -1, because it's a procedure -- not a function.]


Be seeing you,
   Gabriel Boehme


 ------
What amuses me is that Picard has to ask for 'Tea. Earl Grey. Hot.'

This seems to mean:

1) The default value for Tea for the replicator is 'Cold'.

2) If he didn't specify 'Tea' then the Earl Grey himself would
   materialise on the tray. How many 18th century English noblemen
   were brought into existence before Jean-Luc worked that one out.

Lance Parkin
 ------

new topic     » goto parent     » topic index » view message » categorize

6. Re: Error Trapping

> [ADDITIONAL NITPICKY POINTS: Your "if" statement would result in the
> "true/false condition must be an ATOM" error. It should read "if equal(Obj,
> {})" or "if compare(Obj, {}) = 0" instead. Also, My_Procedure can't return a
>  -1, because it's a procedure -- not a function.]

Finally, at least, a correct reply after so many "you should use single qoutes"
..

if v[i] = "" then

.. and ..

if v[i] = '' then

Are both as incorrect as hell.
The problem is the recursive nature of all mathimatical and relational
operators, I suggest Robert wrote a seperate 'mini' -
tutorial on the subject.
Most of all newcomers to Euphoria have problems with this, and explenations such
as:

    -- "you should use single qoutes"
    -- "you should use equal"
    etc.

First of all, both replies assume some algorimic meaning of the program (and
thus take the programming part out of the hands of
the programmer), and lack the explenation *why* ..
The problem isn't in the syntax of the program, its in the understanding of the
programmer. And that will remain a problem until
somebody explains how this works .. somebody asks "why isn't this working" and
half of the people are like "let me do it for
you" .. the list-server community is really great and helpfull to many people,
but it wouldn't hurt any one if we would give it
some thought and what exactly would and would not be helpfull.
This way all our good intentions can have the effect we want it to have.

At the end of this mail is a post I made on the newsgroup on the very same
topic. It should explain this stuff for now (in my
lousy Engish), but I suggest Robert adds a couple of mini-tutorials to the
Euphoria packagae, that explain these kind of things.
Topics I had in mind:

    -- Atom VS sequence (In appending, slicing, concationation)
    -- Recursive nature of mathimatical & relational operators
    -- Simple file I/O
    -- How to time a certain routine/technique
-- Windows: a simple how-to do win32  (list of resources, a quick intro to
    win32lib or the new Liama)
    -- Data management (client/server)

The last topic I will explain a bit futher:
I meant the flow of data. Use local variables to store everything ? Return
    all information ? Return a handle.
    In other words, a quick how-to setup store information handle-based, etc.
    (basic techniques used by almost all libraries managing some kind of data)

Off course, some one else could make such tutorials, but I at least suggest to
pack such tutorials with the standard Euphoria
package.

Now here's the post about the recursive stuff, in my own lacking English..


Michael Dauth <mdauth at bigfoot.com> wrote in message news:7GNTflH8WwB at
mdauth.bigfoot.com...
> Hi,
>
> after banging my head for hours blink I found out that the "="
> operator does not work with sequences, but the equal functions
> does. Am I wrong and if what am I doing if the following code
> does not work:

Indeed, totally correct. If-statements use any legal euphoria express to
represent the TRUE / FALSE value, however Euphoria's
rules about expression (the recursive operator 'theme') allow it in some
occasions to generate a sequence rather than an atom
value.

Sequence is not clearly TRUE or FALSE, therefor the if-statement generates an
error message in such case.
So how do the Euphoria evaluation does work ?

atom a, b, c
a = 1
b = 0

c = not a
? c     -- 0

c = a or b
? c     -- 1

c = a and b
? c     -- 0

sequence d, e, f
d = { 1, 0, 1 }
e = { 0, 1, 1 }

f = not d
? f     -- { 0, 1, 0 }

f = d or e
? f      -- { 1, 1, 1 }

f = d and e
? f      -- { 0, 0, 1 }

object g, h, i
g = 1
h = { 0, 1, 0 }

i = not g
? i     -- 0

i = not h
? i    -- { 1, 0, 1 }

i = g or h
? i    -- { 1, 1, 1 }

i = g and h
? i     -- { 0, 1, 0 }

sequence j, k, l
j = { 1, 0, 0 }
k = { 0, 1 }

l = j or k
? l     -- { { 1, 1 }, { 0, 1 }, { 0, 1} }

l = j and k
 ? l     -- { { 0, 1 }, { 0, 0 }, { 0, 0 } }

-- What applies to the boolean operators also applies to the mathematical
operators.
-- Example:

object m, n
m = { 1, 2, 3 }

n = m * 2
? n     -- { 2, 4, 6 }

n = m * m
? n     -- { 1, 4, 9 }

n = m * { 1, 2, 3, 4 }
? n     -- { { 1, 2, 3 }, { 2, 4, 6 }, { 3, 6, 9 } }

-- In short terminology:
-- Operators recurse whenever the either one of the two values is an atom or
when the two sequences are of different length.

So, since a string / qouted-sequence is handled just like any other sequence,
the 'equal' _operator_ will recurse the
equal-operation.
You could write a recursive function like this to deal with it:

global function equal (object x, object y)
    if atom (x) then
        if atom (y) then
            return x = y
        else
            return 0
        end if
    elsif atom (y) then
        return 0
    elsif length(x) != length(y) then
        return 0
    else
        for index = 1 to length(x) do
            if not equal (x[index], y[index]) then
                return 0
            end if
        end for
        return 1
    end if
end function

But, guess what ? Its already built-in, and called precisely the same.
You also have compare, but unlike the equal function which will only return an
atom true / false value, compare returns either
zero, minus one and plus one. Example:

atom o, p
o = 1
p = 2

? compare (o, p)       ---     1
? compare (p, o)       ---     -1
? compare (o, o)       ---    0
? compare (p, p)       ---     1

I hope this was helpful, I always feel examples show more than words alone,
nevertheless, feel free to ask for more explanation
if any part is unclear.

Good luck learning Euphoria ..

Ralf Nieuwenhuijsen
... mailto://nieuwen at xs4all.nl
... mailto://ralf_n at email.com
... http://www.xs4all.nl/~nieuwen
... uin: 9389920

new topic     » goto parent     » topic index » view message » categorize

7. Re: Error Trapping

At 03:26 PM 5/13/99 +0200, you wrote:
>
>Finally, at least, a correct reply after so many "you should use single
>qoutes" ..
>

You'll note, however, that the "single quote" thingie solved his problem. blink

new topic     » goto parent     » topic index » view message » categorize

8. Re: Error Trapping

Message text written by Ralf:
>object m, n
m =3D { 1, 2, 3 }
...
n =3D m * { 1, 2, 3, 4 }
? n     -- { { 1, 2, 3 }, { 2, 4, 6 }, { 3, 6, 9 } }
<

Sorry, Ralf.  You can't do that.

Colin

new topic     » goto parent     » topic index » view message » categorize

9. Re: Error Trapping

> At 03:26 PM 5/13/99 +0200, you wrote:
> >
> >Finally, at least, a correct reply after so many "you should use single
> >qoutes" ..
> >
>
> You'll note, however, that the "single quote" thingie solved his problem. blink

It didn't. It just made his program work. Not the same thing, is it ? blink

Ralf

new topic     » goto parent     » topic index » view message » categorize

10. Re: Error Trapping

Ralf Nieuwenhuijsen wrote:

>if v[i] = "" then
>
>.. and ..
>
>if v[i] = '' then
>
>Are both as incorrect as hell.

Yes, because the original post you seem to be responding to ["Rob
questions"] had a space between the quotes. (And BTW, there's no such thing
as a '' char in Euphoria -- you'll get a "single-quote char is empty"
error.)


>The problem is the recursive nature of all mathimatical and relational
>operators, I suggest Robert wrote a seperate 'mini' - tutorial on the
>subject.

This might not be a bad idea. Almost every other language allows the use of
"=" comparisons between strings in "if" statements, and remembering *not* to
do so in Euphoria can be difficult. Perhaps a "new Euphoria programmer's
list of tips" might be helpful -- brief overviews of Euphoria's major
differences from other languages, with links or references to the
appropriate section(s) of the manual for further explanation.

Of course, as with the current Euphoria docs, the person has to actually
*read* this new document, which doesn't always happen...


>somebody asks "why isn't this working" and half of the people are like
>"let me do it for you" .. the list-server community is really great and
>helpfull to many people, but it wouldn't hurt any one if we would give
>it some thought and what exactly would and would not be helpfull.

For the most part, I think the people answering questions here on the list
do a good job of giving *some* reasoning behind their solutions. As far as
"what exactly would and would not be helpful," replies are only helpful when
they are at least factually correct.


>object m, n
>m = { 1, 2, 3 }
>
>[snip]
>
>n = m * { 1, 2, 3, 4 }
>? n     -- { { 1, 2, 3 }, { 2, 4, 6 }, { 3, 6, 9 } }

If you had actually executed the above code segment, you would quickly have
discovered the following error message:

"sequence lengths are not the same (3 != 4)"

You can only do arithmetic operations on two atoms, an atom and a sequence,
or two sequences of the exact same length (these rules apply recursively to
every element of a sequence).


From REFMAN.DOC, section 2.2.4 (Operations on sequences), paragraph three:

"If a binary (two-operand) operator has operands which are both sequences
THEN THE TWO SEQUENCES *MUST* BE OF THE SAME LENGTH."  [emphasis mine --
perhaps this should also be emphasized in the manual, since I skipped right
over it the first time through]


And, from this very ListServ:

 ----------
From: Boehme, Gabriel
Subject: Re: each keyword
Date: Thursday, April 22, 1999 7:33PM

Ralf Nieuwenhuijsen wrote:

> [snip] Try print (1, {1,2,3} * {1,2,3})
>Euphoria, as an exception, or to be consistent (choose), will do the
>following, because the two sequence are of the same length.
>
>{1, 4, 9}

It's not the exception -- it's the rule.


>But what when they are not of the same length ?
>
>print (1, {1,2,3} * {1,2,3,4})

The program abends with a "sequence lengths are not the same" error message.
 ----------


As I, too, have learned the hard way: it's always a good idea to actually
check your examples before you post them. :)


Be seeing you,
   Gabriel Boehme


 ------
None of the modern machines, none of the modern paraphernalia...
have any power except over the people who choose to use them.

G.K. Chesterton
 ------

new topic     » goto parent     » topic index » view message » categorize

11. Re: Error Trapping

> Ralf Nieuwenhuijsen wrote:
>
> >if v[i] = "" then
> >
> >.. and ..
> >
> >if v[i] = '' then
> >
> >Are both as incorrect as hell.
>
> Yes, because the original post you seem to be responding to ["Rob
> questions"] had a space between the quotes. (And BTW, there's no such thing
> as a '' char in Euphoria -- you'll get a "single-quote char is empty"
> error.)

It was precisely that error I was talking about.
(My mistake though: there was a space between the qoutes)

> Of course, as with the current Euphoria docs, the person has to actually
> *read* this new document, which doesn't always happen...

True, although most actually will read the docs when they get stuck.
Esspecially when they remember there are sections about esspecially those
situations.

>> >somebody asks "why isn't this working" and half of the people are like
> >"let me do it for you" .. the list-server community is really great and
> >helpfull to many people, but it wouldn't hurt any one if we would give
> >it some thought and what exactly would and would not be helpfull.
>
> For the most part, I think the people answering questions here on the list
> do a good job of giving *some* reasoning behind their solutions. As far as
> "what exactly would and would not be helpful," replies are only helpful when
> they are at least factually correct.

That last sentence is a pun. Thank you. No really I do agree, on the other hand,
isn't it in every body's interest if such vague
parts of Euphoria get discussed ?
I simple wanted to start up, what imho is a usefull discussion.

> >object m, n
> >m = { 1, 2, 3 }
> >
> >[snip]
> >
> >n = m * { 1, 2, 3, 4 }
> >? n     -- { { 1, 2, 3 }, { 2, 4, 6 }, { 3, 6, 9 } }
>
> If you had actually executed the above code segment, you would quickly have
> discovered the following error message:
>
> "sequence lengths are not the same (3 != 4)"

See how vague even I am on the subject ?  I was pretty sure it worked did way,
but never bothered to try it out.

Ralf

new topic     » goto parent     » topic index » view message » categorize

12. Error Trapping

All,

        Is there a way to trap errors in Euphoria?  I am working
on a project that involves an index of procedures and functions, the
problem I am having is when someone enters the name of a function, if
they do not have the proper number of parameters for that particular
function Euphoria Issues an Error and aborts the program.  Is there a
way I could trap this parameters error and issue and error message?

        If not I guess I will have to include the number of parameters
in the index for each function.  BTW I am using a sequence for the index
and routine_id() and call_func or call_proc to call these routines, got
the idea from EUSERVE? works like a charm.

        Any and All HELP would be greatly appreciated.

Later all:

+ + +  Rev. Ferlin Scarborough  -  Centreville, Alabama  -  USA

email: ferlin at sandw.net
email: ferlin at email.com

new topic     » goto parent     » topic index » view message » categorize

13. Re: Error Trapping

Why is'nt your input routine monitoring the users input and
watching the number and type of parmameters ????

Bernie

new topic     » goto parent     » topic index » view message » categorize

14. Re: Error Trapping

Ferlin <ferlin at SANDW.NET> wrote:

>        Is there a way to trap errors in Euphoria?  I am working
>on a project that involves an index of procedures and functions, the
>problem I am having is when someone enters the name of a function, if
>they do not have the proper number of parameters for that particular
>function Euphoria Issues an Error and aborts the program.  Is there a
>way I could trap this parameters error and issue and error message?

This is a good question. Currently, when you get a routine_id(), you have to
know in advance how many parameters it requires, what their types are, and
whether the routine is a procedure or a function. I think it would be kinda
neat if there were another function added to the routine_id() family:

s = routine_info(id)

Where s would be a sequence containing the relevant data:

R_TYPE = 1,     -- integer value indicating if this is a
                -- procedure or a function
    R_PROCEDURE = 1,
    R_FUNCTION = 2,

R_PARM_DATA = 2 -- sequence containing the routine id's of all the
                -- parameter types for this routine
                -- number of parms = length(s[R_PARM_DATA])

Obviously, this kind of thing would at least require the built-in types
(atom(), sequence(), etc.) to return valid routine_id() values, so that the
R_PARM_DATA sequence always gives us valid routine id's.

With this kind of thing available, it would be possible to completely verify
all aspects of a user-entered routine -- how many parameters, what kind of
parameters, and if we should expect a return value.


Gabriel Boehme

new topic     » goto parent     » topic index » view message » categorize

15. Re: Error Trapping

"Boehme, Gabriel" wrote:
>
>
> s = routine_info(id)
>
> Where s would be a sequence containing the relevant data:
>
> R_TYPE = 1,     -- integer value indicating if this is a
>                 -- procedure or a function
>     R_PROCEDURE = 1,
>     R_FUNCTION = 2,
>
> R_PARM_DATA = 2 -- sequence containing the routine id's of all the
>                 -- parameter types for this routine
>                 -- number of parms = length(s[R_PARM_DATA])
>

I like the sound of this idea, and to me it looks elegant enough to fit
into the current Euphoria Language Syntax, it is consistent with some of
the other functions.

+ + +  Rev. Ferlin Scarborough  -  Centreville, Alabama  -  USA

email: ferlin at sandw.net
email: ferlin at email.com

new topic     » goto parent     » topic index » view message » categorize

16. Re: Error Trapping

>"Boehme, Gabriel" wrote:
>>
>>
>> s = routine_info(id)
>>
>> Where s would be a sequence containing the relevant data:
>>
>> R_TYPE = 1,     -- integer value indicating if this is a
>>                 -- procedure or a function
>>     R_PROCEDURE = 1,
>>     R_FUNCTION = 2,
>>
>> R_PARM_DATA = 2 -- sequence containing the routine id's of all the
>>                 -- parameter types for this routine
>>                 -- number of parms = length(s[R_PARM_DATA])
>>
>
>I like the sound of this idea, and to me it looks elegant enough to fit
>into the current Euphoria Language Syntax, it is consistent with some of
>the other functions.

A library follows. (i wanne hear 'thank you' .. blink
All you have to do now, is call either register_function or register_procedure
tell the routine-id and those of its parameters
and you're done.

--- whatyouwant.e

sequence rtypes, rdata

global procedure register_function (integer rp, sequence rd)
    if rp > length(rtypes) then
        rtypes &= repeat (-1,  rp-length(types) )
        rdata &= repeat ("", rp-length(types) )
    end if
    rtypes[rp] = R_FUNCTION
    rdata[rp] = rd
end procedure

global procedure register_function (integer rp, sequence rd)
    if rp > length(rtypes) then
        rtypes &= repeat (-1,  rp-length(types) )
        rdata &= repeat ("", rp-length(types) )
    end if
    rtypes[rp] = R_PROCEDURE
    rdata[rp] = rd
end procedure

global function routine_info (integer rp)
    if rp > length(rtypes) then
        return -1
    elsif rtype[rp] != -1 then
        return {rtypes[rp], rdata[rp]}
    else
        return -1
    end if
end function

Ralf Nieuwenhuijsen
nieuwen at xs4all.nl
ralf_n at email.com
Uin: 9389920

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu