summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/release-notes.md4
-rw-r--r--src/SMAPI.Internal/ExceptionExtensions.cs27
2 files changed, 21 insertions, 10 deletions
diff --git a/docs/release-notes.md b/docs/release-notes.md
index 20fdd2c1..8c98af5d 100644
--- a/docs/release-notes.md
+++ b/docs/release-notes.md
@@ -1,6 +1,10 @@
← [README](README.md)
# Release notes
+## Upcoming release
+* For mod authors:
+ * Fixed rare `NullReferenceException` in SMAPI's error-handling.
+
## 3.12.2
Released 05 August 2021 for Stardew Valley 1.5.4 or later.
diff --git a/src/SMAPI.Internal/ExceptionExtensions.cs b/src/SMAPI.Internal/ExceptionExtensions.cs
index 5f1ee1fa..d8189048 100644
--- a/src/SMAPI.Internal/ExceptionExtensions.cs
+++ b/src/SMAPI.Internal/ExceptionExtensions.cs
@@ -13,19 +13,26 @@ namespace StardewModdingAPI.Internal
/// <param name="exception">The error to summarize.</param>
public static string GetLogSummary(this Exception exception)
{
- switch (exception)
+ try
{
- case TypeLoadException ex:
- return $"Failed loading type '{ex.TypeName}': {exception}";
+ switch (exception)
+ {
+ case TypeLoadException ex:
+ return $"Failed loading type '{ex.TypeName}': {exception}";
- case ReflectionTypeLoadException ex:
- string summary = ex.ToString();
- foreach (Exception childEx in ex.LoaderExceptions ?? new Exception[0])
- summary += $"\n\n{childEx?.GetLogSummary()}";
- return summary;
+ case ReflectionTypeLoadException ex:
+ string summary = ex.ToString();
+ foreach (Exception childEx in ex.LoaderExceptions ?? new Exception[0])
+ summary += $"\n\n{childEx?.GetLogSummary()}";
+ return summary;
- default:
- return exception.ToString();
+ default:
+ return exception?.ToString() ?? $"<null exception>\n{Environment.StackTrace}";
+ }
+ }
+ catch (Exception ex)
+ {
+ throw new InvalidOperationException($"Failed handling {exception?.GetType().FullName} (original message: {exception?.Message})", ex);
}
}