If you've ever written a command-line tool in C++, you've hit this moment: a file won't open, a flag is malformed, a config value is garbage — and now what? Do you throw ? Do you return some sentinel value and hope everyone remembers to check it? C++23 gave us a new option, std::expected , and it's changed how a lot of people answer that question. This article walks through both approaches, explains the tradeoffs in plain English, and shows real code so you can decide for yourself. The Core Idea, In One Sentence Exceptions say "something went wrong, stop everything, and let some code way up the call stack deal with it." std::expected says "this function might fail, so its return type honestly says so — you can't ignore it without looking silly." That's really the whole philosophical difference. Everything else is details. A Mental Model: The Post Office vs. The Vending Machine Think of exceptions like mailing a letter. You drop it in...