Index: src/ControlStruct/ExceptTranslate.cpp
===================================================================
--- src/ControlStruct/ExceptTranslate.cpp	(revision 2345ab36a435b6dcc4e66d25babebf1df018b2bf)
+++ src/ControlStruct/ExceptTranslate.cpp	(revision dab9fb935e8f3e194c31f53d65635713bf0b1348)
@@ -482,15 +482,41 @@
 		ast::FunctionDecl * terminate_catch,
 		ast::FunctionDecl * terminate_match ) {
-	// { __cfaehm_try_terminate(`try`, `catch`, `match`); }
-
-	ast::UntypedExpr * caller = new ast::UntypedExpr(loc, new ast::NameExpr(loc,
-		"__cfaehm_try_terminate" ) );
-	caller->args.push_back( new ast::VariableExpr(loc, try_wrapper ) );
-	caller->args.push_back( new ast::VariableExpr(loc, terminate_catch ) );
-	caller->args.push_back( new ast::VariableExpr(loc, terminate_match ) );
-
-	ast::CompoundStmt * callStmt = new ast::CompoundStmt(loc);
-	callStmt->push_back( new ast::ExprStmt( loc, caller ) );
-	return callStmt;
+	// {
+	//     int __handler_index = __cfaehm_try_terminate(`try`, `match`);
+	//     if ( __handler_index ) {
+	//         `catch`( __handler_index, __cfaehm_get_current_exception() );
+	//     }
+	// }
+
+	ast::ObjectDecl * index = new ast::ObjectDecl( loc, "__handler_index",
+		new ast::BasicType( ast::BasicType::SignedInt ),
+		new ast::SingleInit( loc,
+			new ast::UntypedExpr( loc,
+				new ast::NameExpr( loc, "__cfaehm_try_terminate" ),
+				{
+					new ast::VariableExpr( loc, try_wrapper ),
+					new ast::VariableExpr( loc, terminate_match ),
+				}
+			)
+		)
+	);
+
+	return new ast::CompoundStmt( loc, {
+		new ast::DeclStmt( loc, index ),
+		new ast::IfStmt( loc,
+			new ast::VariableExpr( loc, index ),
+			new ast::ExprStmt( loc,
+				new ast::UntypedExpr( loc,
+					new ast::VariableExpr( loc, terminate_catch ),
+					{
+						new ast::VariableExpr( loc, index ),
+						new ast::UntypedExpr( loc,
+							new ast::NameExpr( loc, "__cfaehm_get_current_exception" )
+						),
+					}
+				)
+			)
+		),
+	} );
 }
 
