diff options
| author | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2021-10-07 18:46:41 -0400 | 
|---|---|---|
| committer | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2021-10-07 18:46:41 -0400 | 
| commit | 8263a4406be34b438d295220b99c48502a6636bd (patch) | |
| tree | e95341b9f96ed47a006a437b13c55942278896bf /src/SMAPI.Mods.ErrorHandler/Patches | |
| parent | 2a0a7191a7b943a50e30077b5cdd36eb11aa5dd1 (diff) | |
| download | SMAPI-8263a4406be34b438d295220b99c48502a6636bd.tar.gz SMAPI-8263a4406be34b438d295220b99c48502a6636bd.tar.bz2 SMAPI-8263a4406be34b438d295220b99c48502a6636bd.zip | |
add key to duplicate-dictionary-key exceptions
Diffstat (limited to 'src/SMAPI.Mods.ErrorHandler/Patches')
| -rw-r--r-- | src/SMAPI.Mods.ErrorHandler/Patches/DictionaryPatcher.cs | 33 | 
1 files changed, 28 insertions, 5 deletions
| diff --git a/src/SMAPI.Mods.ErrorHandler/Patches/DictionaryPatcher.cs b/src/SMAPI.Mods.ErrorHandler/Patches/DictionaryPatcher.cs index 6ad64e16..8ceafcc5 100644 --- a/src/SMAPI.Mods.ErrorHandler/Patches/DictionaryPatcher.cs +++ b/src/SMAPI.Mods.ErrorHandler/Patches/DictionaryPatcher.cs @@ -48,6 +48,11 @@ namespace StardewModdingAPI.Mods.ErrorHandler.Patches                          original: AccessTools.Method(dictionaryType, "get_Item") ?? throw new InvalidOperationException($"Can't find method {PatchHelper.GetMethodString(dictionaryType, "get_Item")} to patch."),                          finalizer: this.GetHarmonyMethod(nameof(DictionaryPatcher.Finalize_GetItem))                      ); + +                    harmony.Patch( +                        original: AccessTools.Method(dictionaryType, "Add") ?? throw new InvalidOperationException($"Can't find method {PatchHelper.GetMethodString(dictionaryType, "Add")} to patch."), +                        finalizer: this.GetHarmonyMethod(nameof(DictionaryPatcher.Finalize_Add)) +                    );                  }              }          } @@ -63,13 +68,31 @@ namespace StardewModdingAPI.Mods.ErrorHandler.Patches          private static Exception Finalize_GetItem(object key, Exception __exception)          {              if (__exception is KeyNotFoundException) -            { -                DictionaryPatcher.Reflection -                    .GetField<string>(__exception, "_message") -                    .SetValue($"{__exception.Message}\nkey: '{key}'"); -            } +                DictionaryPatcher.AddKey(__exception, key);              return __exception;          } + +        /// <summary>The method to call after a dictionary insert throws an exception.</summary> +        /// <param name="key">The dictionary key being inserted.</param> +        /// <param name="__exception">The exception thrown by the wrapped method, if any.</param> +        /// <returns>Returns the exception to throw, if any.</returns> +        private static Exception Finalize_Add(object key, Exception __exception) +        { +            if (__exception is ArgumentException) +                DictionaryPatcher.AddKey(__exception, key); + +            return __exception; +        } + +        /// <summary>Add the dictionary key to an exception message.</summary> +        /// <param name="exception">The exception whose message to edit.</param> +        /// <param name="key">The dictionary key.</param> +        private static void AddKey(Exception exception, object key) +        { +            DictionaryPatcher.Reflection +                .GetField<string>(exception, "_message") +                .SetValue($"{exception.Message}\nkey: '{key}'"); +        }      }  } | 
