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
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
3. Re: Error Trapping
- Posted by Lewis Townsend <keroltarr at HOTMAIL.COM>
May 12, 1999
-
Last edited May 13, 1999
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
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
------
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
------
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
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
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.
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
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.
It didn't. It just made his program work. Not the same thing, is it ?
Ralf
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
------
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
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
13. Re: Error Trapping
Why is'nt your input routine monitoring the users input and
watching the number and type of parmameters ????
Bernie
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
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
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' ..
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