diff --git a/mercurial/extensions.py b/mercurial/extensions.py
index 01c1ee4bd1dd1eb60307575b4c603fe9511ce50c_bWVyY3VyaWFsL2V4dGVuc2lvbnMucHk=..1b2b727a885f0fc71f36afe6a0b15e8c6bd823f3_bWVyY3VyaWFsL2V4dGVuc2lvbnMucHk= 100644
--- a/mercurial/extensions.py
+++ b/mercurial/extensions.py
@@ -42,7 +42,12 @@
         fd, fpath, desc = imp.find_module(f, [d])
         return imp.load_module(module_name, fd, fpath, desc)
     else:
-        return imp.load_source(module_name, path)
+        try:
+            return imp.load_source(module_name, path)
+        except IOError, exc:
+            if not exc.filename:
+                exc.filename = path # python does not fill this
+            raise
 
 def load(ui, name, path):
     # unused ui argument kept for backwards compatibility
diff --git a/mercurial/hook.py b/mercurial/hook.py
index 01c1ee4bd1dd1eb60307575b4c603fe9511ce50c_bWVyY3VyaWFsL2hvb2sucHk=..1b2b727a885f0fc71f36afe6a0b15e8c6bd823f3_bWVyY3VyaWFsL2hvb2sucHk= 100644
--- a/mercurial/hook.py
+++ b/mercurial/hook.py
@@ -169,7 +169,11 @@
                     path = util.expandpath(path)
                     if repo:
                         path = os.path.join(repo.root, path)
-                    mod = extensions.loadpath(path, 'hghook.%s' % hname)
+                    try:
+                        mod = extensions.loadpath(path, 'hghook.%s' % hname)
+                    except Exception:
+                        ui.write(_("loading %s hook failed:\n") % hname)
+                        raise
                     hookfn = getattr(mod, cmd)
                 else:
                     hookfn = cmd[7:].strip()
diff --git a/tests/test-hook.t b/tests/test-hook.t
index 01c1ee4bd1dd1eb60307575b4c603fe9511ce50c_dGVzdHMvdGVzdC1ob29rLnQ=..1b2b727a885f0fc71f36afe6a0b15e8c6bd823f3_dGVzdHMvdGVzdC1ob29rLnQ= 100644
--- a/tests/test-hook.t
+++ b/tests/test-hook.t
@@ -530,6 +530,20 @@
   nothing changed
   [1]
 
+  $ echo '[hooks]' > .hg/hgrc
+  $ echo "update.ne = python:`pwd`/nonexisting.py:testhook" >> .hg/hgrc
+  $ echo "pre-identify.npmd = python:`pwd`/:no_python_module_dir" >> .hg/hgrc
+
+  $ hg up null
+  loading update.ne hook failed:
+  abort: No such file or directory: $TESTTMP/d/repo/nonexisting.py
+  [255]
+
+  $ hg id
+  loading pre-identify.npmd hook failed:
+  abort: No module named repo!
+  [255]
+
   $ cd ../../b
 
 make sure --traceback works on hook import failure