stride3d/stride · error · NodePresenterException
An error occurred while updating the value of the node, see…
Error message
An error occurred while updating the value of the node, see the inner exception for more information.
What it means
ItemNodePresenter.UpdateValue delegates the actual write to Container.Update(newValue, Index); any exception from the underlying node/property graph is wrapped in a NodePresenterException with a generic message and the original exception preserved as InnerException. It is a uniform error boundary so UI layers can handle node update failures consistently.
Solutions
- Inspect InnerException to find the root cause thrown by the property setter or node update
- Validate the new value's type and constraints before assigning it via the node presenter
- Fix the target property setter so it does not throw for legitimate values
- Catch NodePresenterException at the UI layer and show the inner message to the user
Example fix
// before
nodePresenter.UpdateValue(rawValue);
// after
if (nodePresenter.Type.IsInstanceOfType(rawValue))
nodePresenter.UpdateValue(rawValue);
else
Log.Warning($"Cannot assign {rawValue?.GetType().Name} to {nodePresenter.Type.Name}"); Defensive patterns
Strategy: try-catch
Validate before calling
if (!nodePresenter.Type.IsInstanceOfType(newValue))
throw new ArgumentException($"Value of type {newValue?.GetType()} is not assignable to {nodePresenter.Type}"); Type guard
static bool CanAssign(INodePresenter node, object value) => value == null ? !node.Type.IsValueType : node.Type.IsInstanceOfType(value);
Try / catch
try { node.UpdateValue(newValue); } catch (NodePresenterException ex) { Log.Error(ex.InnerException, "Node update failed"); ShowError(ex.InnerException?.Message ?? ex.Message); } Prevention
- Always check InnerException — the outer message is intentionally generic
- Validate value type and range constraints before UpdateValue
- Keep property setters exception-free for valid inputs
- Catch NodePresenterException at the property-grid layer and surface the root cause to the user
When it happens
Trigger: Calling UpdateValue on an item node whose underlying member rejects the new value: a property setter throwing, a type-incompatible value, a read-only/collection constraint, or validation inside the object model failing during the update.
Common situations: Editing a property in Stride's Game Studio property grid with an invalid value (e.g. negative size, bad enum assignment); a script/component setter throwing; deserialized data in an inconsistent state; assigning a value of the wrong type to an indexed item.
Understand the failure class
Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.
Related errors
- Invalid fulltype name
- The type must be of EntityComponent
- Custom strides is not supported with packed PixelFormats
- Unable to find the base
- Unable to find the graph corresponding to the base part
AI-assisted analysis of stride3d/stride@96fad776d2 (2026-09-14).
Data as JSON: /api/errors/3559986a5342cdd5.
Report an issue: GitHub.
Appendix: source
Thrown at sources/presentation/Stride.Core.Presentation.Quantum/Presenters/ItemNodePresenter.cs:69
public override Type Type { get; }
public override bool IsEnumerable => Container.IsEnumerable;
public override ITypeDescriptor? Descriptor { get; }
public override object Value => Container.Retrieve(Index);
protected override IObjectNode? ParentingNode => Container.ItemReferences != null ? Container.IndexedTarget(Index) : null;
public override void UpdateValue(object newValue)
{
try
{
Container.Update(newValue, Index);
}
catch (Exception e)
{
throw new NodePresenterException("An error occurred while updating the value of the node, see the inner exception for more information.", e);
}
}
public override void AddItem(object value)
{
if (Container.IndexedTarget(Index)?.IsEnumerable != true)
throw new NodePresenterException($"{nameof(MemberNodePresenter)}.{nameof(AddItem)} cannot be invoked on members that are not collection.");
try
{
Container.IndexedTarget(Index).Add(value);
}
catch (Exception e)
{
throw new NodePresenterException("An error occurred while adding an item to the node, see the inner exception for more information.", e);
}
}
View on GitHub (pinned to 96fad776d2)