I don't have an XBee and I don't know if @wwbrown means that they have behind-the-scenes arrangments to ensure high reliability of transmission and reception.
In general I think there are two significant risks with wireless comms - a complete failure to send or receive or a garbled message.
It should be relatively easy to write code that works like a "dead man's handle" on a train. If nothing is received for X seconds / millisecs (whatever) assume that comms has failed.
There are a few things you can do to avoid garbled messages. You can include a byte that represents the total number of bytes in the message, or you could ensure that messages all have a standard length. You can include some form of checksum in the message. There is a lot of intense mathematical study in this field and you wil have to judge for yourself how complex you want to be. Suppose there are 7 bytes in a message. A simple arrangement is to XOR all 7 of the bytes in the message and store the resulting byte as an 8th byte. The receiving code uses the exact same algorithm and expects to get an answer that is identical to the 8th byte.
...R