Fix CLI nontermination by wrapping in try catch
diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/cmdline/KSPJvmMain.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/cmdline/KSPJvmMain.kt
index 269a847..0687a7c 100644
--- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/cmdline/KSPJvmMain.kt
+++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/cmdline/KSPJvmMain.kt
@@ -47,17 +47,23 @@
 
     val logger = KspGradleLogger(loggingLevel)
 
-    val (config, classpath) = parse(args)
-    val processorClassloader = URLClassLoader(classpath.map { File(it).toURI().toURL() }.toTypedArray())
+    try {
+        val (config, classpath) = parse(args)
+        val processorClassloader = URLClassLoader(classpath.map { File(it).toURI().toURL() }.toTypedArray())
 
-    @Suppress("UNCHECKED_CAST")
-    val processorProviders = ServiceLoader
-        .load(
-            processorClassloader.loadClass("com.google.devtools.ksp.processing.SymbolProcessorProvider"),
-            processorClassloader
-        )
-        .toList() as List<SymbolProcessorProvider>
+        @Suppress("UNCHECKED_CAST")
+        val processorProviders = ServiceLoader
+            .load(
+                processorClassloader.loadClass("com.google.devtools.ksp.processing.SymbolProcessorProvider"),
+                processorClassloader
+            )
+            .toList() as List<SymbolProcessorProvider>
 
-    val exitCode = KotlinSymbolProcessing(config, processorProviders, logger).execute()
-    exitProcess(exitCode.code)
+        val exitCode = KotlinSymbolProcessing(config, processorProviders, logger).execute()
+        exitProcess(exitCode.code)
+    } catch (t: Throwable) {
+        logger.exception(t)
+        t.printStackTrace()
+        exitProcess(KotlinSymbolProcessing.ExitCode.PROCESSING_ERROR.code)
+    }
 }