# Class LlmException

java.lang.Object
java.lang.Throwable
java.lang.Exception
java.io.IOException
com.codename1.ai.LlmException

public class LlmException extends IOException

The single checked-error type raised by `LlmClient`. Extends `IOException` so callers' existing network catch blocks pick it up. Inspect `getType()` for the failure category and switch on the `LlmException.ErrorType` enum -- no separate exception subclass per error.

    try {
        ChatResponse r = client.chat(req).get();
        // ...
    } catch (AsyncExecutionException ae) {
        if (ae.getCause() instanceof LlmException) {
            LlmException e = (LlmException) ae.getCause();
            switch (e.getType()) {
                case RATE_LIMIT:        scheduleRetry(e.getRetryAfterSeconds()); break;
                case AUTH:              showLoginScreen(); break;
                case CONTEXT_LENGTH:    trimHistory();    break;
                case MODEL_OVERLOADED:  scheduleRetry(60); break;
                case INVALID_REQUEST:   showError(e);     break;
                case NETWORK:           showOfflineUi();  break;
                default:                showError(e);
            }
        }
    }

`httpStatus`, `providerErrorCode`, `rawBody`, and (for rate-limit errors) `retryAfterSeconds` are populated when the provider returned them. `getRetryAfterSeconds()` returns `-1` for every non-rate-limit error and for rate-limit errors where the provider didn't send a `Retry-After` header.

- ## Nested Class Summary

  Nested Classes
  Modifier and Type
  Class
  Description
  `static enum`
  `LlmException.ErrorType`
  Coarse-grained classification of every failure path the client can surface.

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `LlmException(String message)`
  `LlmException(String message, int httpStatus, String providerErrorCode, String rawBody, Throwable cause, LlmException.ErrorType type)`
  `LlmException(String message, int httpStatus, String providerErrorCode, String rawBody, Throwable cause, LlmException.ErrorType type, int retryAfterSeconds)`
  `LlmException(String message, Throwable cause)`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `int`
  `getHttpStatus()`
  `String`
  `getProviderErrorCode()`
  `String`
  `getRawBody()`
  `int`
  `getRetryAfterSeconds()`
  Seconds the provider asked us to wait before retrying, parsed from a `Retry-After` header.
  `LlmException.ErrorType`
  `getType()`
  Coarse-grained category -- the recommended switching point for error handling.

  ### Methods inherited from class Throwable

  `addSuppressed, getCause, getLocalizedMessage, getMessage, getStackTrace, getSuppressed, initCause, printStackTrace, setStackTrace, toString`

  ### Methods inherited from class Object

  `clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait`

- ## Constructor Details

  - ### LlmException

    public LlmException(String message)

  - ### LlmException

    public LlmException(String message, Throwable cause)

  - ### LlmException

    public LlmException(String message, int httpStatus, String providerErrorCode, String rawBody, Throwable cause, LlmException.ErrorType type)

  - ### LlmException

    public LlmException(String message, int httpStatus, String providerErrorCode, String rawBody, Throwable cause, LlmException.ErrorType type, int retryAfterSeconds)

- ## Method Details

  - ### getType

    public LlmException.ErrorType getType()
    Coarse-grained category -- the recommended switching point for error handling. See the class javadoc for the full pattern.

  - ### getHttpStatus

    public int getHttpStatus()

  - ### getProviderErrorCode

    public String getProviderErrorCode()

  - ### getRawBody

    public String getRawBody()

  - ### getRetryAfterSeconds

    public int getRetryAfterSeconds()
    Seconds the provider asked us to wait before retrying, parsed from a `Retry-After` header. `-1` when not applicable (the usual case for non-`RATE_LIMIT` errors) or when the provider did not send the header.