[Canonical page](<https://docs.dhtmlx.com/planning-engine/net/api/core/errors/overview/>)
[Full documentation index](<https://docs.dhtmlx.com/planning-engine/llms.txt>)


# errors

The exceptions the engine throws. Every engine failure is a [`PlenException`](<https://docs.dhtmlx.com/planning-engine/net/api/core/errors/plen-exception.md>), an abstract base with two sealed subclasses:

- [`InputException`](<https://docs.dhtmlx.com/planning-engine/net/api/core/errors/input-exception.md>) - the data or options passed to a call are invalid. `Kind` is an [`InputErrorKind`](<https://docs.dhtmlx.com/planning-engine/net/api/core/errors/input-exception.md#inputerrorkind>) (`Parse` or `Validation`), and `Path` names the input field the error refers to, such as `tasks[2].duration`.
- [`ProjectException`](<https://docs.dhtmlx.com/planning-engine/net/api/core/errors/project-exception.md>) - the call doesn't fit the current state of a `Project`. `Code` is a [`ProjectError`](<https://docs.dhtmlx.com/planning-engine/net/api/core/errors/project-exception.md#projecterror>): `NoBaseline`, `StaleBaseline` or `NeedsResync`.

`catch (PlenException)` covers both, including the exceptions from `SkillLayer.Slots` in the `Plen.Assign` package. A null argument that isn't declared nullable throws `ArgumentNullException` instead.

Cycles, conflicts, a planner that didn't converge and operations that `Project.Apply` rejected aren't exceptions. They come back as data in the result. Every type here is in the `Plen` namespace. For how to handle each failure and recover a project, see [Error handling](<https://docs.dhtmlx.com/planning-engine/net/error-handling.md>).

:::category-index
:::
