Maybe another Obelix example?
In the service industry, you want your clerks to handle as many customer problems as possible. Handle the problem at the lowest level you can.
If the customer wants two bags, give them two bags. If they want their receipt handed to them, don't put it in the bag. Likewise,
If you're trying to multiply two numbers, but the programmer only gave you one? Let the guard statement end the function early. Easy. There are 100s of ways you handle issues at the lower levels of your code.
However, there are times when it might not be appropriate for your lower level code to fix the problem. There may be numerous and varied error codes to consider, or the issue isn't with the user or the program, but with the network, or security, or file storage.
These are problems not easily solved by your lower level code. This is where your function might say "this is above my paygrade to solve" and you'll pass the error UP the chain-of-command to a floor supervisor, or to the department manager. Let THEM deal with the problem. In programming speak, you THROW the error, and let another process CATCH it. In some cases, a process might catch an error, decide it can't solve the problem either and it will re-THROW the error. In short, the clerk gives the problem to the floor supervisor. The floor supervisor can't solve the problem and passes it up to the department manager.
Additionally, when you throw an error, you often pack the error object with clarifying information that will help the supervisors understand what was happening when the error occured. Again, this might be too much for a lower level function to handle. Pass the error up the chain and let a specialist handle the error.