Re: What should function returning a reference return on failure?
"Jim Langston" <tazmaster@rocketmail.com> wrote in message
news:OGJ7g.77$7q7.0@fe05.lga...
"Alf P. Steinbach" <alfps@start.no> wrote in message
news:4c952hF148g4lU2@individual.net...
* Jim Langston:
I'm sure this has been asked a few times, but I'm still not sure.
If the function returns a reference, it's guaranteeing that if it
returns, the result is a valid reference.
You have the choice of using (1) a reference to some special object
denoting "no object" or "failure", or (2) throwing an exception.
(2) is most clean, most reliable wrt. client code checking, and may help
avoid constructing a large dummy object.
Dang, there's one problem with the try...catch.
try
{
CMap& ThisMap = FindMap( MapNumber );
}
catch ( int )
{
LogError("Could not find map");
}
That ThisMap is only going to exist during the lifetime of the try block.
And I can't create it outside the block because it's a reference and has
to be initialized.
Now this means I'll have to put whole blocks of code inside the try block,
but I don't want to catch errors in a block for all the code, and a lot of
the code should execute anyway even if they can't find the map.
That is, this code won't compile:
int i = 1;
try
{
int& j = i;
}
catch (...)
{
}
std::cout << j << std::endl;
I finally settled on this (ugly) code:
// Get a reference in the map for this player
try
{
CPlayer& ThisPlayer = FindPlayer( Socket );
}
catch ( int )
{
SendMessageToPlayer( Socket, MSG_SERVER_MESSAGE, "<Message not sent,
please relog - Error has been logged>" );
MessageBuffer.push_back( LogError( "Unlogged in client attempting to send
message on socket " + StrmConvert<std::string>( Socket ) + " on IP " +
IP ) );
return 0;
}
CPlayer& ThisPlayer = FindPlayer( Socket );
My feeling being that if it doesn't throw on the first call to FindPlayer
it's not going to throw on the second call to FindPlayer and I can proceed.
If it does throw on the second call somehow then it's an actual program
error and the program can halt on an uncaught error.