diff --git a/src/backends/regex.c b/src/backends/regex.c
index cba50e65c3740ee4b134c18969324368fd60d0d3..5fe3aa0b73b2b09536c3effffd0c21c36445930d 100644
--- a/src/backends/regex.c
+++ b/src/backends/regex.c
@@ -348,12 +348,7 @@ bool h_svm_action_clear_to_mark(HArena *arena, HSVMContext *ctx, void* env) {
 // Glue regex backend to rest of system
 
 bool h_compile_regex(HRVMProg *prog, const HParser *parser) {
-  if (setjmp(prog->except)) {
-    return false;
-  }
-  bool ret = parser->vtable->compile_to_rvm(prog, parser->env);
-  memset(prog->except, 0, sizeof(prog->except));
-  return ret;
+  return parser->vtable->compile_to_rvm(prog, parser->env);
 }
 
 static void h_regex_free(HParser *parser) {
@@ -375,12 +370,16 @@ static int h_regex_compile(HAllocator *mm__, HParser* parser, const void* params
   prog->insns = NULL;
   prog->actions = NULL;
   prog->allocator = mm__;
+  if (setjmp(prog->except)) {
+    return false;
+  }
   if (!h_compile_regex(prog, parser)) {
     h_free(prog->insns);
     h_free(prog->actions);
     h_free(prog);
     return 2;
   }
+  memset(prog->except, 0, sizeof(prog->except));
   h_rvm_insert_insn(prog, RVM_ACCEPT, 0);
   parser->backend_data = prog;
   return 0;