diff --git a/src/main/java/com/googlesource/gerrit/plugins/supermanifest/JiriManifestParser.java b/src/main/java/com/googlesource/gerrit/plugins/supermanifest/JiriManifestParser.java
index 1080bf4..96e0326 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/supermanifest/JiriManifestParser.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/supermanifest/JiriManifestParser.java
@@ -17,6 +17,7 @@
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
@@ -27,11 +28,13 @@
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.stream.StreamSource;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.lib.Repository;
 
 class JiriManifestParser {
   public static JiriProjects getProjects(Repository repo, String ref, String manifest)
-      throws Exception {
+      throws ConfigInvalidException, IOException {
     Queue<String> q = new LinkedList<>();
     q.add(manifest);
     HashSet<String> processedFiles = new HashSet<>();
@@ -43,9 +46,14 @@
         continue;
       }
       processedFiles.add(file);
-      JiriManifest m = parseManifest(repo, ref, file);
+      JiriManifest m;
+      try {
+        m = parseManifest(repo, ref, file);
+      } catch (JAXBException | XMLStreamException e) {
+        throw new ConfigInvalidException("XML parse error", e);
+      }
       if (m.imports.getImports().length != 0) {
-        throw new Exception(
+        throw new ConfigInvalidException(
             String.format("Manifest %s contains remote imports which are not supported", file));
       }
 
@@ -53,7 +61,7 @@
         project.fillDefault();
         if (projectMap.containsKey(project.Key())) {
           if (!projectMap.get(project.Key()).equals(project))
-            throw new Exception(
+            throw new ConfigInvalidException(
                 String.format(
                     "Duplicate conflicting project %s in manifest %s\n%s\n%s",
                     project.Key(),
@@ -65,7 +73,12 @@
         }
       }
 
-      URI parentURI = new URI(file);
+      URI parentURI;
+      try {
+        parentURI = new URI(file);
+      } catch (URISyntaxException e) {
+        throw new ConfigInvalidException("Invalid parent URI", e);
+      }
       for (JiriManifest.LocalImport l : m.imports.getLocalImports()) {
         q.add(parentURI.resolve(l.getFile()).getPath());
       }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/supermanifest/JiriUpdater.java b/src/main/java/com/googlesource/gerrit/plugins/supermanifest/JiriUpdater.java
index 981e867..3e92349 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/supermanifest/JiriUpdater.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/supermanifest/JiriUpdater.java
@@ -3,13 +3,16 @@
 import static com.google.gerrit.reviewdb.client.RefNames.REFS_HEADS;
 
 import com.googlesource.gerrit.plugins.supermanifest.SuperManifestRefUpdatedListener.GerritRemoteReader;
+import java.io.IOException;
 import java.net.URI;
 import java.text.MessageFormat;
 import org.eclipse.jgit.api.errors.ConcurrentRefUpdateException;
+import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.api.errors.JGitInternalException;
 import org.eclipse.jgit.dircache.DirCache;
 import org.eclipse.jgit.dircache.DirCacheBuilder;
 import org.eclipse.jgit.dircache.DirCacheEntry;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.gitrepo.internal.RepoText;
 import org.eclipse.jgit.internal.JGitText;
 import org.eclipse.jgit.lib.CommitBuilder;
@@ -45,8 +48,7 @@
 
   private void updateSubmodules(
       Repository repo, String targetRef, JiriProjects projects, GerritRemoteReader reader)
-      throws Exception {
-
+      throws IOException, GitAPIException {
     DirCache index = DirCache.newInCore();
     DirCacheBuilder builder = index.builder();
     ObjectInserter inserter = repo.newObjectInserter();
@@ -154,7 +156,8 @@
   }
 
   @Override
-  public void update(GerritRemoteReader reader, ConfigEntry c, String srcRef) throws Exception {
+  public void update(GerritRemoteReader reader, ConfigEntry c, String srcRef)
+      throws IOException, GitAPIException, ConfigInvalidException {
     Repository srcRepo = reader.openRepository(c.getSrcRepoKey().toString());
     Repository destRepo = reader.openRepository(c.getDestRepoKey().toString());
     JiriProjects projects = JiriManifestParser.getProjects(srcRepo, srcRef, c.getXmlPath());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/supermanifest/RepoUpdater.java b/src/main/java/com/googlesource/gerrit/plugins/supermanifest/RepoUpdater.java
index c385eee..d04506e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/supermanifest/RepoUpdater.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/supermanifest/RepoUpdater.java
@@ -21,6 +21,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
+import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.gitrepo.ManifestParser;
 import org.eclipse.jgit.gitrepo.RepoCommand;
 import org.eclipse.jgit.lib.PersonIdent;
@@ -34,7 +35,8 @@
   }
 
   @Override
-  public void update(GerritRemoteReader reader, ConfigEntry c, String srcRef) throws Exception {
+  public void update(GerritRemoteReader reader, ConfigEntry c, String srcRef) throws
+      IOException, GitAPIException {
     Repository destRepo = reader.openRepository(c.getDestRepoKey().toString());
     Repository srcRepo = reader.openRepository(c.getSrcRepoKey().toString());
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/supermanifest/SubModuleUpdater.java b/src/main/java/com/googlesource/gerrit/plugins/supermanifest/SubModuleUpdater.java
index 421beae..30f3d00 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/supermanifest/SubModuleUpdater.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/supermanifest/SubModuleUpdater.java
@@ -15,9 +15,13 @@
 package com.googlesource.gerrit.plugins.supermanifest;
 
 import com.googlesource.gerrit.plugins.supermanifest.SuperManifestRefUpdatedListener.GerritRemoteReader;
+import java.io.IOException;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 
 interface SubModuleUpdater {
 
   /** Reads manifest and generates sub modules */
-  void update(GerritRemoteReader reader, ConfigEntry c, String srcRef) throws Exception;
+  void update(GerritRemoteReader reader, ConfigEntry c, String srcRef)
+      throws IOException, GitAPIException, ConfigInvalidException;
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/supermanifest/SuperManifestRefUpdatedListener.java b/src/main/java/com/googlesource/gerrit/plugins/supermanifest/SuperManifestRefUpdatedListener.java
index ed153d6..ca339ac 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/supermanifest/SuperManifestRefUpdatedListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/supermanifest/SuperManifestRefUpdatedListener.java
@@ -232,24 +232,8 @@
       }
 
       try {
-        SubModuleUpdater subModuleUpdater;
-        switch (c.getToolType()) {
-          case Repo:
-            subModuleUpdater = new RepoUpdater(serverIdent, canonicalWebUrl);
-            break;
-          case Jiri:
-            subModuleUpdater = new JiriUpdater(serverIdent, canonicalWebUrl);
-            break;
-          default:
-            throw new ConfigInvalidException(
-                String.format("invalid toolType: %s", c.getToolType().name()));
-        }
-        try (GerritRemoteReader reader = new GerritRemoteReader()) {
-          subModuleUpdater.update(reader, c, event.getRefName());
-        }
-      } catch (
-          Exception
-              e) { //catch all exceptions as gerrit doesn't print stack trace for thrown Exception
+        updateForConfig(c, event);
+      } catch (ConfigInvalidException | IOException | GitAPIException e) {
         // We only want the trace up to here. We could recurse into the exception, but this at least
         // trims the very common jgit.gitrepo.RepoCommand.RemoteUnavailableException.
         StackTraceElement here = Thread.currentThread().getStackTrace()[1];
@@ -267,6 +251,24 @@
     }
   }
 
+  private void updateForConfig(ConfigEntry c, Event event) throws ConfigInvalidException, IOException, GitAPIException {
+    SubModuleUpdater subModuleUpdater;
+    switch (c.getToolType()) {
+      case Repo:
+        subModuleUpdater = new RepoUpdater(serverIdent, canonicalWebUrl);
+        break;
+      case Jiri:
+        subModuleUpdater = new JiriUpdater(serverIdent, canonicalWebUrl);
+        break;
+      default:
+        throw new ConfigInvalidException(
+            String.format("invalid toolType: %s", c.getToolType().name()));
+    }
+    try (GerritRemoteReader reader = new GerritRemoteReader()) {
+      subModuleUpdater.update(reader, c, event.getRefName());
+    }
+  }
+
   /**
    * Remove boring stack frames. This retains the innermost frames up to and including the {@code
    * class#method} passed in {@code ref}.
