Skip to main content

Error handling

Exceptions

All exceptions live under Renfordt\AvatarSmithy\Exceptions.

ValidationException

Extends InvalidArgumentException. Thrown by builder setters on invalid input, with named factory methods:

FactoryTriggered by
invalidSize(int, int $min=8, int $max=2048)size() outside 8–2048.
invalidLightness(float, string $field)lightness outside 0.01.0.
invalidPositiveInteger(int, string $field)a value that must be > 0.
invalidNonNegativeInteger(int, string $field)a value that must be >= 0.

EngineFailedException

Extends RuntimeException. Thrown from generate() in debug mode when an engine throws. Carries the engine class name (getEngineName()) and wraps the original exception as previous.

AllEnginesFailedException

Extends RuntimeException. Thrown from generate() when every engine in the chain has failed or declined.

MemberDescription
$failures (readonly)Array of per-engine failure records.
getFailures()Same array.
getFailureSummary()A human-readable, multi-line summary of the failures.

Each failure record has the shape:

['engine' => string, 'error' => string, 'exception' => ?Throwable]

RuntimeException

A plain RuntimeException is thrown by generate() when no engine has been set, and by the builder when an unknown engine name is requested.

Patterns

Guaranteed success

End the chain with a local engine so generate() does not throw. The initials engine declines on an empty name, so include a generative local engine when names may be missing:

$avatar = Avatar::for($user)
->try('gravatar')
->fallbackTo('initials')
->fallbackTo('gradient') // always produces output
->generate();

Handling total failure

use Renfordt\AvatarSmithy\Exceptions\AllEnginesFailedException;

try {
$avatar = Avatar::engine('dicebear')->seed($email)->generate();
} catch (AllEnginesFailedException $e) {
error_log($e->getFailureSummary());
// serve a static placeholder
}

Inspecting without catching

getLastErrors() returns the failures recorded during the last generate() call, cleared at the start of each call. Combined with a logger, this is useful for observing which engines declined in a chain that ultimately succeeded.

Logging

The builder accepts a PSR-3 logger via the constructor or setLogger(); it defaults to Psr\Log\NullLogger. Engine failures are logged at warning level (with the exception attached) and null returns at debug level.