TL;DR: Errors are a UI. Viem (Ethereum TypeScript library) sets the bar for developer-facing errors. Here's a real viem error when a contract call reverts — notice how every field helps you debug:
The contract function "transfer" reverted with the following reason:
Internal error
Contract Call:
address: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48