This node used to live under C++: catch is exempt from standard C++ syntax, until an editor and I agreed to move it to this title -- after all, the syntax of catch is standard, seeing as ISO C++ defines it that way.

Look carefully at this code. See anything wrong?

struct TooBig {
  int val;                       // Too big value
  TooBig(int val_) : val(val_) {}

void g()
  int x = function1(17);       // Get some value
  if (x > 29)
    throw TooBig(x);

  try {                   
    int y = function_throwing_TooBig(x);
    std::cout << "Got the value " << y << endl;
  catch (TooBig z)
    std::cerr << "Oops! " << z.val << " is too big!" << endl;
Seems straightforward enough (if you can consider any C++ code using exceptions "straightforward").

Unfortunately, it's not legal (ISO) C++. While

  if (condition)
is legal syntax, the seemingly equivalent
  try {
    // ...
  catch (X x)
is NOT! You have to wrap the body of catch and try in brackets, even if it's just a single statement.

This is supposed to be "clearer". After all, lots of people insist on surrounding every single-statement if or else or for or while with braces, "because it's clearer and my lousy excuse for a text editor can't handle indentation." These people would be better served eating quiche and programming in Pascal, but let's accommodate them. Now, obviously we can't change existing syntax. But we can invent new syntax for new keywords, and make that inconsistent with the old syntax! That way, C programmers can't program exceptions (because the new syntax is inconsistent with what they know), and Pascal programmers can't read control flow (because the old syntax is different from that for exceptions).

Maybe that's why They call them EXCEPTIONS...