void Main() { var harmony = new Harmony("test"); Harmony.DEBUG = true; harmony.PatchAll(); Class.Test(); } [HarmonyPriority(Priority.High)] [HarmonyPatch(typeof(Class), nameof(Class.Test))] static class Patch1 { static Exception Finalizer(Exception __exception) { Console.WriteLine("Finalizer1"); return new Exception("E2"); } } [HarmonyPriority(Priority.Low)] [HarmonyPatch(typeof(Class), nameof(Class.Test))] static class Patch2 { static Exception Finalizer(Exception __exception) { Console.WriteLine("Finalizer2"); return new Exception("E3"); } } static class Class { public static void Test() { Console.WriteLine("Test"); throw new Exception("E1"); } } /* result after first patch ### Patch: static System.Void Class::Test() ### Replacement: static System.Void UserQuery+Class::UserQuery+Class.Test_Patch1() IL_0000: Local var 0: System.Boolean IL_0000: Local var 1: System.Exception IL_0000: ldc.i4 0 IL_0005: stloc 0 (System.Boolean) IL_0009: ldnull IL_000A: stloc 1 (System.Exception) .try { IL_000E: // start original IL_000E: ldstr "Test" IL_0013: call static System.Void System.Console::WriteLine(System.String value) IL_0018: ldstr "E1" IL_001D: newobj System.Void System.Exception::.ctor(System.String message) IL_0022: throw IL_0023: // end original (has dead code end) IL_0023: ldloc 1 (System.Exception) IL_0027: call static System.Exception Patch1::Finalizer(System.Exception __exception) IL_002C: stloc 1 (System.Exception) IL_0030: ldc.i4.1 IL_0031: stloc 0 (System.Boolean) IL_0035: ldloc 1 (System.Exception) IL_0039: brfalse => Label2 IL_003E: ldloc 1 (System.Exception) IL_0042: throw IL_0043: Label2 IL_0043: leave => (autogenerated) } // end try .catch System.Object { IL_0048: stloc 1 (System.Exception) IL_004C: ldloc 0 (System.Boolean) IL_0050: brtrue => Label5 .try { IL_0055: ldloc 1 (System.Exception) IL_0059: call static System.Exception Patch1::Finalizer(System.Exception __exception) IL_005E: stloc 1 (System.Exception) IL_0062: leave => (autogenerated) } // end try .catch System.Object { IL_0067: pop IL_0068: leave => (autogenerated) } // end handler IL_006D: Label5 IL_006D: ldloc 1 (System.Exception) IL_0071: brfalse => Label10 IL_0076: ldloc 1 (System.Exception) IL_007A: throw IL_007B: Label10 IL_007B: leave => (autogenerated) } // end handler IL_0080: ret DONE */ /* result after second patch ### Patch: static System.Void Class::Test() ### Replacement: static System.Void UserQuery+Class::UserQuery+Class.Test_Patch2() IL_0000: Local var 0: System.Boolean IL_0000: Local var 1: System.Exception IL_0000: ldc.i4 0 IL_0005: stloc 0 (System.Boolean) IL_0009: ldnull IL_000A: stloc 1 (System.Exception) .try { IL_000E: // start original IL_000E: ldstr "Test" IL_0013: call static System.Void System.Console::WriteLine(System.String value) IL_0018: ldstr "E1" IL_001D: newobj System.Void System.Exception::.ctor(System.String message) IL_0022: throw IL_0023: // end original (has dead code end) IL_0023: ldloc 1 (System.Exception) IL_0027: call static System.Exception Patch1::Finalizer(System.Exception __exception) IL_002C: stloc 1 (System.Exception) IL_0030: ldloc 1 (System.Exception) IL_0034: call static System.Exception Patch2::Finalizer(System.Exception __exception) IL_0039: stloc 1 (System.Exception) IL_003D: ldc.i4.1 IL_003E: stloc 0 (System.Boolean) IL_0042: ldloc 1 (System.Exception) IL_0046: brfalse => Label2 IL_004B: ldloc 1 (System.Exception) IL_004F: throw IL_0050: Label2 IL_0050: leave => (autogenerated) } // end try .catch System.Object { IL_0055: stloc 1 (System.Exception) IL_0059: ldloc 0 (System.Boolean) IL_005D: brtrue => Label5 .try { IL_0062: ldloc 1 (System.Exception) IL_0066: call static System.Exception Patch1::Finalizer(System.Exception __exception) IL_006B: stloc 1 (System.Exception) IL_006F: leave => (autogenerated) } // end try .catch System.Object { IL_0074: pop IL_0075: leave => (autogenerated) } // end handler .try { IL_007A: ldloc 1 (System.Exception) IL_007E: call static System.Exception Patch2::Finalizer(System.Exception __exception) IL_0083: stloc 1 (System.Exception) IL_0087: leave => (autogenerated) } // end try .catch System.Object { IL_008C: pop IL_008D: leave => (autogenerated) } // end handler IL_0092: Label5 IL_0092: ldloc 1 (System.Exception) IL_0096: brfalse => Label14 IL_009B: ldloc 1 (System.Exception) IL_009F: throw IL_00A0: Label14 IL_00A0: leave => (autogenerated) } // end handler IL_00A5: ret DONE */