Good program design dictates that each level must check for all possible errors and exceptional conditions. Upon detecting such, it must first attempt to resolve them at that level. Failing that, the condition is reported up to the next level for resolution.