bugprone-std-exception-baseclass

Ensure that every value that in a throw expression is an instance of std::exception.

Deriving all exceptions from std::exception allows callers to catch all exceptions with a single catch block and provides access to the what() method for diagnostics. Throwing arbitrary types creates hidden contracts, reduces interoperability with the standard library, and may result in program termination.

class custom_exception {};

void throwing() noexcept(false) {
  // Problematic throw expressions.
  throw int(42);
  throw custom_exception();
}

class mathematical_error : public std::exception {};

void throwing2() noexcept(false) {
  // These kind of throws are ok.
  throw mathematical_error();
  throw std::runtime_error();
  throw std::exception();
}