don't set plugin to fail state if we threw InvalidPluginOperationException

These are supposed to indicate to the user that they called a function at the wrong point in time. We don't want to actually mutate the state in that case.
This commit is contained in:
goat 2024-12-23 21:03:31 +01:00
parent 8276c19c6f
commit a1ae33bfee
2 changed files with 24 additions and 3 deletions

View file

@ -0,0 +1,16 @@
namespace Dalamud.Plugin.Internal.Exceptions;
/// <summary>
/// An exception to be thrown when policy blocks a plugin from loading.
/// </summary>
internal class InternalPluginStateException : InvalidPluginOperationException
{
/// <summary>
/// Initializes a new instance of the <see cref="InternalPluginStateException"/> class.
/// </summary>
/// <param name="message">The message to associate with this exception.</param>
public InternalPluginStateException(string message)
: base(message)
{
}
}

View file

@ -281,7 +281,7 @@ internal class LocalPlugin : IAsyncDisposable
case PluginState.Unloaded:
if (this.instance is not null)
{
throw new InvalidPluginOperationException(
throw new InternalPluginStateException(
"Plugin should have been unloaded but instance is not cleared");
}
@ -413,7 +413,9 @@ internal class LocalPlugin : IAsyncDisposable
}
catch (Exception ex)
{
this.State = PluginState.LoadError;
// These are "user errors", we don't want to mark the plugin as failed
if (ex is not InvalidPluginOperationException)
this.State = PluginState.LoadError;
// If a precondition fails, don't record it as an error, as it isn't really.
if (ex is PluginPreconditionFailedException)
@ -476,7 +478,10 @@ internal class LocalPlugin : IAsyncDisposable
}
catch (Exception ex)
{
this.State = PluginState.UnloadError;
// These are "user errors", we don't want to mark the plugin as failed
if (ex is not InvalidPluginOperationException)
this.State = PluginState.UnloadError;
Log.Error(ex, "Error while unloading {PluginName}", this.InternalName);
throw;