473,396 Members | 2,139 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,396 software developers and data experts.

Is this a good idea? (Error handling with overloaded operators)

Hi.

Is this a good idea?:

<begin code>
/* Addition operator: += */
const BigFix &BigFix::operator+=(const BigFix &rhs)
{
ErrorType err;
int lhs_sign = sign, rhs_sign = rhs.sign;

/* Special cases */
if(lhs_sign == 0) /* interpreted as zero */
{
/* treat as zero */
return(rhs);
}

if(rhs_sign == 0) /* interpreted as zero */
{
/* treat as zero */
return(*this);
}

/* Compare signs */
if(lhs_sign == rhs_sign)
{
/* Just do ordinary addition */
if((err = MPFix_AddUnsigned(this, &rhs)).dwErrCode !=
XXXX_SUCCESS)
throw Exception(err); <<<<<<<<<<<<<<<<<< here

/* Set sign */
sign = lhs_sign;
}

if((lhs_sign == 1) && (rhs_sign == -1))
{
/* Subtract */
if((err = MPFix_SubUnsigned(this, &rhs)).dwErrCode !=
XXXX_SUCCESS)
throw Exception(err); <<<<<<<<<<<<<<<<<< here
}

if((lhs_sign == -1) && (rhs_sign == 1))
{
/* Subtract */
sign = 1;
if((err = MPFix_SubUnsigned(this, &rhs)).dwErrCode !=
XXXX_SUCCESS)
throw Exception(err); <<<<<<<<<<<<<<<<<< here

/* Reverse sign (we subtracted |this| - |rhs|, we want |rhs| - |
this|) */
sign = -sign;
}

/* Done! */
return(*this);
}
<end code>

What does that do, you might ask? Well, it's for a bignum library I've
been making for a program that needs it, and it's supposed to overload
the "+=" operator to add the big numbers, in this case big fixed-point
numbers. I left out a few things like the definition of ErrorType and
MPFix_AddUnsigned(), MPFix_SubUnsigned() for brevity but they are not
what I am asking about here. You should be able to get the gist of
what the code is supposed to do, just remember that
MPFix_AddUnsigned() and MPFix_SubUnsigned() are just add/sub routines
that treat both operands as positive.

Anyway, with the explanation out of the way, I'd like some criticism
of this, especially of the whole error handling. Is it really a good
idea to just throw exceptions like that out of the operator on an
overflow? Or would it be better to instead have some sort of "error
flag" in the BigFix that is usually zero, but then is set to some
nonzero number when an error occurs, depending on the error? The
problem is that we have to catch exceptions from _every_ piece of
code that uses the numbers. Unfortunately (or fortunately?) these seem
to be the only two ways of getting error information outside of an
overloaded operator like that (since it's meant to be used in
expressions like "a += b" then it must return a _BigFix_ and not
something else). So is this a good idea or a bad one?

May 25 '07 #1
5 1685
mike3 wrote:
Is this a good idea?:
Anyway, with the explanation out of the way, I'd like some criticism
of this, especially of the whole error handling. Is it really a good
idea to just throw exceptions like that out of the operator on an
overflow? Or would it be better to instead have some sort of "error
flag" in the BigFix that is usually zero, but then is set to some
nonzero number when an error occurs, depending on the error?
It depends on the intended use. If the goal is behave as do the
built-in types, then aborting is probably the best solution; the
user should check his values up front. In many cases, however,
this is a bit brutal, and exceptions are a good compromise.
(Overflow will usually occur because the program didn't---or
couldn't---correctly check its input, not because program state
has been corrupted.) A flag or a special value which propagates
emulates IEEE behavior, of course, which has also proven itself
in practice. It does mean that you have to define behavior for
all such cases (but you can inspire yourself from the IEEE
specification).
The problem is that we have to catch exceptions from _every_
piece of code that uses the numbers.
If you don't catch it, you abort. Depending on use, that might
be correct.

--
James Kanze (Gabi Software) email: ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

May 26 '07 #2
On May 26, 4:14 am, James Kanze <james.ka...@gmail.comwrote:
mike3 wrote:
Is this a good idea?:
Anyway, with the explanation out of the way, I'd like some criticism
of this, especially of the whole error handling. Is it really a good
idea to just throw exceptions like that out of the operator on an
overflow? Or would it be better to instead have some sort of "error
flag" in the BigFix that is usually zero, but then is set to some
nonzero number when an error occurs, depending on the error?

It depends on the intended use. If the goal is behave as do the
built-in types, then aborting is probably the best solution; the
user should check his values up front. In many cases, however,
this is a bit brutal, and exceptions are a good compromise.
(Overflow will usually occur because the program didn't---or
couldn't---correctly check its input, not because program state
has been corrupted.) A flag or a special value which propagates
emulates IEEE behavior, of course, which has also proven itself
in practice. It does mean that you have to define behavior for
all such cases (but you can inspire yourself from the IEEE
specification).
The problem is that we have to catch exceptions from _every_
piece of code that uses the numbers.

If you don't catch it, you abort. Depending on use, that might
be correct.
However what if I don't want it to just abort because I neglected
to handle some exception in some loop or something that involves
use of the big number operations?
--
James Kanze (Gabi Software) email: james.ka...@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

May 26 '07 #3
On May 26, 4:14 am, James Kanze <james.ka...@gmail.comwrote:
mike3 wrote:
Is this a good idea?:
Anyway, with the explanation out of the way, I'd like some criticism
of this, especially of the whole error handling. Is it really a good
idea to just throw exceptions like that out of the operator on an
overflow? Or would it be better to instead have some sort of "error
flag" in the BigFix that is usually zero, but then is set to some
nonzero number when an error occurs, depending on the error?

It depends on the intended use. If the goal is behave as do the
built-in types, then aborting is probably the best solution; the
user should check his values up front. In many cases, however,
this is a bit brutal, and exceptions are a good compromise.
(Overflow will usually occur because the program didn't---or
couldn't---correctly check its input, not because program state
has been corrupted.) A flag or a special value which propagates
emulates IEEE behavior, of course, which has also proven itself
in practice. It does mean that you have to define behavior for
all such cases (but you can inspire yourself from the IEEE
specification).
The problem is that we have to catch exceptions from _every_
piece of code that uses the numbers.

If you don't catch it, you abort. Depending on use, that might
be correct.
However what if I don't want it to just abort because I neglected
to handle some exception in some loop or something that involves
use of the big number operations?
--
James Kanze (Gabi Software) email: james.ka...@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

May 26 '07 #4
On 26 Maj, 21:47, mike3 <mike4...@yahoo.comwrote:
On May 26, 4:14 am, James Kanze <james.ka...@gmail.comwrote:


mike3 wrote:
Is this a good idea?:
Anyway, with the explanation out of the way, I'd like some criticism
of this, especially of the whole error handling. Is it really a good
idea to just throw exceptions like that out of the operator on an
overflow? Or would it be better to instead have some sort of "error
flag" in the BigFix that is usually zero, but then is set to some
nonzero number when an error occurs, depending on the error?
It depends on the intended use. If the goal is behave as do the
built-in types, then aborting is probably the best solution; the
user should check his values up front. In many cases, however,
this is a bit brutal, and exceptions are a good compromise.
(Overflow will usually occur because the program didn't---or
couldn't---correctly check its input, not because program state
has been corrupted.) A flag or a special value which propagates
emulates IEEE behavior, of course, which has also proven itself
in practice. It does mean that you have to define behavior for
all such cases (but you can inspire yourself from the IEEE
specification).
The problem is that we have to catch exceptions from _every_
piece of code that uses the numbers.
No you don't: you catch the exception everywhere you want to handle
the error, and that is far rarer than every time you use your bignum.
>
If you don't catch it, you abort. Depending on use, that might
be correct.

However what if I don't want it to just abort because I neglected
to handle some exception in some loop or something that involves
use of the big number operations?
What is the alternative? I hope you don't want to just compute along
with bad data. The simple truth is that if there is an error, the best
way to handle it is to react to it. Ignoring it is not really an
option. Using exceptions requires you to do an active effort to
neglect it.
As James pointed out, using the IEEE specification could be a good
inspiration. One thing you could reasonably do is to specify the
action to take in case of an overflow. One reasonable approach could
be to return bigint_max or something like that, and if you specifiy
this overflow is no longer an error.

/Peter

May 26 '07 #5
On May 26, 9:47 pm, mike3 <mike4...@yahoo.comwrote:
On May 26, 4:14 am, James Kanze <james.ka...@gmail.comwrote:
mike3 wrote:
Is this a good idea?:
Anyway, with the explanation out of the way, I'd like some criticism
of this, especially of the whole error handling. Is it really a good
idea to just throw exceptions like that out of the operator on an
overflow? Or would it be better to instead have some sort of "error
flag" in the BigFix that is usually zero, but then is set to some
nonzero number when an error occurs, depending on the error?
It depends on the intended use. If the goal is behave as do the
built-in types, then aborting is probably the best solution; the
user should check his values up front. In many cases, however,
this is a bit brutal, and exceptions are a good compromise.
(Overflow will usually occur because the program didn't---or
couldn't---correctly check its input, not because program state
has been corrupted.) A flag or a special value which propagates
emulates IEEE behavior, of course, which has also proven itself
in practice. It does mean that you have to define behavior for
all such cases (but you can inspire yourself from the IEEE
specification).
The problem is that we have to catch exceptions from _every_
piece of code that uses the numbers.
If you don't catch it, you abort. Depending on use, that might
be correct.
However what if I don't want it to just abort because I neglected
to handle some exception in some loop or something that involves
use of the big number operations?
Then catch the exception or use some other technique. As I
said, IEEE has had some success with using special values which
propagate.

--
James Kanze (Gabi Software) email: ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

May 27 '07 #6

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

9
by: John Cho | last post by:
// CHO, JOHN #include<iostream> class fracpri{ int whole; int numer; int denom;
20
by: Brad Eck | last post by:
"The only operators that cannot be overloaded are :: (scope resolution), . (member selection), and .* (member selection through pointer to function). Quoting from Stroustrup's 3rd edition of _The...
1
by: masood.iqbal | last post by:
I have a few questions regarding overloaded typecast operators and copy constructors that I would like an answer for. Thanks in advance. Masood (1) In some examples that I have seen...
4
by: masood.iqbal | last post by:
Please help me with this doubt that I have regarding overloaded operators. Sometimes they are member functions and sometimes they are friends (e.g. see the code snippet from Stroustrup, Second...
10
by: maadhuu | last post by:
hi i wasnt to know the answer for the following. now ,u can overload all the operators which are basically determined at runtime (coz' of whch operators like sizeof())cannot be overloaded. now...
10
by: nimmi_srivastav | last post by:
Below you will see an example of a nested conditional expression that this colleague of mine loves. He claims that it is more efficient that a multi-level if-else-if structure. Moreover, our...
3
by: iluvatar | last post by:
Hi all. I have written a 3d-vector class (for 3-dimensional space) and I have overloaded the arihtmetic operators like +, +=, * and so on. Also, the constructor works with doubles and has...
159
by: bernard | last post by:
howdy! please recommend a good c compiler. - should be small - should be fast - should come with a good ide - should be inexpensive i am using windows os.
23
by: tonytech08 | last post by:
What I like about the C++ object model: that the data portion of the class IS the object (dereferencing an object gets you the data of a POD object). What I don't like about the C++ object...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.