Structured Exceptions

April 4, 2026 · View on GitHub

The library provides detailed exception information from ClickHouse errors.

Exception Hierarchy

ClickHouseException (interface)
├── QueryException (LogicException)
│   └── DatabaseException (ClickHouse server errors)
├── TransportException (RuntimeException) — curl/HTTP errors
└── ClickHouseUnavailableException — connection refused

DatabaseException

Thrown when ClickHouse returns a server error (bad SQL, missing table, auth failure, etc.).

use ClickHouseDB\Exception\DatabaseException;

try {
    $db->select('SELECT * FROM non_existent_table');
} catch (DatabaseException $e) {
    echo $e->getMessage();                  // "Table default.non_existent_table doesn't exist.\nIN:SELECT ..."
    echo $e->getCode();                     // 60
    echo $e->getClickHouseExceptionName();  // 'UNKNOWN_TABLE' (CH 22+) or null (older versions)
    echo $e->getQueryId();                  // 'abc-123-def' (from X-ClickHouse-Query-Id header)
}

Available Methods

MethodReturnsDescription
getMessage()stringError message + SQL
getCode()intClickHouse error code
getClickHouseExceptionName()?stringe.g. UNKNOWN_TABLE, SYNTAX_ERROR (CH 22+)
getQueryId()?stringQuery ID from response header
getRequestDetails()arrayRequest metadata
getResponseDetails()arrayResponse metadata

Common Error Codes

CodeException NameDescription
60UNKNOWN_TABLETable doesn't exist
62SYNTAX_ERRORSQL syntax error
81DATABASE_NOT_FOUNDDatabase doesn't exist
115UNKNOWN_SETTINGInvalid setting
192UNKNOWN_USERUser doesn't exist
241MEMORY_LIMIT_EXCEEDEDQuery exceeded memory limit
516AUTHENTICATION_FAILEDWrong password or user

Error Format Support

The library parses both old and new ClickHouse error formats:

# Old format (CH < 22)
Code: 60. DB::Exception: Table default.xxx doesn't exist., e.what() = DB::Exception

# New format (CH 22+)
Code: 60. DB::Exception: Table default.xxx doesn't exist. (UNKNOWN_TABLE) (version 24.3.2.23 (official build))

TransportException

Thrown for HTTP/curl-level errors (timeouts, connection refused, etc.).

use ClickHouseDB\Exception\TransportException;

try {
    $db->select('SELECT sleep(100)');
} catch (TransportException $e) {
    echo $e->getMessage(); // "Operation timed out"
    echo $e->getCode();    // curl error number
}

ClickHouseUnavailableException

Thrown when the server is unreachable.

use ClickHouseDB\Exception\ClickHouseUnavailableException;

try {
    $db->ping(true);
} catch (ClickHouseUnavailableException $e) {
    echo "ClickHouse is down: " . $e->getMessage();
}