The oracle doesn’t give a high confidence score about the price.
The price jumped too far since the last slot.
The random number has not arrived yet.
On Solana, just as on any other blockchain where transactions are atomic, your program cannot wait for a better input. It has to decide now, with the data it was given. If acting is its only output, it will act on bad data too. So a failure to proceed alongside with its reason must be an output as well. The refusal is not a crash, it's just one of the outcomes the protocol was designed to have.
Examples
Drift. The program grades the oracle before every action. The band around the price (Pyth's confidence interval) is too wide: uncertain. The update is too old: stale. The price is too far from its own five-minute average: too volatile. Each action has its own rule. The pool fills only on a price that passed every check.
The refusals also look different: when the AMM cannot fill because the price is not good enough, the program just logs the AMM cannot fill and does not fail the transaction, the order stays open and another user can still match it.
Kamino keeps a plausible range per token. A USDC price far from $1 is refused, even if the oracle is confident. But for different actions there are different constraints. If you need to borrow, the protocol should be confident that everything is in normal state. A liquidation needs only a loaded, fresh, usable price, so a price that drifted from its average or left its plausible range still allows liquidation, while it stops every new borrow.
A coin flip on Switchboard VRF stores its refusal. While a round is open, the player cannot start a new one. Only the oracle's answer closes it. The settling instruction asks for the revealed value. If it is not revealed, the instruction fails with a "randomness not resolved" error.
Sometimes a trade on a live market is refused because the oracle is not sure. A user can lose some trades. But at least the protocol is not lost, when the oracle is wrong.