How to throw 404 error in Drupal module?

For Drupal 8+

use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
// then
throw new NotFoundHttpException();

It is easy. These should take care of watchdog, HTTP 404 response code and other related things.

For Drupal 6 & 7

In your module's page callback, do: return drupal_not_found();

For Drupal 8

In the class::method() referred to in the _controller definition (i.e. the page callback or the method responsible for generating output for the request), do:

throw new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException();

References

  • drupal_not_found() documentation for Drupal 6.
  • drupal_not_found() documentation for Drupal 7.
  • NotFoundHttpException documentation for Drupal 8.