For example, a program may request that the operating system reserve a block of memory for the program’s use. If the operating system is unable to honor the request – if the memory request is too large or if there is not enough available memory – it will send a memory exception to the layer that made the request. The exception will continue to travel through the layers until it is dealt with. If the program does not catch the exception, because the programmer did not write code to handle that particular exception, the exception makes its way to the top layer and the operating system recognizes it as an unhandled exception and shuts down the program, resulting in a fatal exception error. Well-designed software, however, handles all exceptions.