There are some situations where errors are not that fatal, or you even expect something to fail.
- The MAX_TRIES loop in File::Temp: This tries some file names until open won't give EEXIST any more. Personally I often write code like this where I take advantage of the atomicity of system calls (e.g. use the fact that open tests for existence).
- When you write a port scanner using connect calls.
- This might qualify as well: Replace duplicate files with hardlinks (although something like "next" could be done with exceptions quite easily).