Skip to content

Error Handling Best Practices in XOOPS

Proper error handling is critical for application reliability, debugging, and user experience.

Exception Hierarchy

<?php
// Base exception
class ModuleException extends \Exception
{
    protected $statusCode = 500;

    public function __construct($message = '', $code = 0, $statusCode = 500)
    {
        parent::__construct($message, $code);
        $this->statusCode = $statusCode;
    }

    public function getStatusCode()
    {
        return $this->statusCode;
    }
}

// Specific exceptions
class ValidationException extends ModuleException
{
    protected $statusCode = 400;
    private $errors = [];

    public function __construct($message, $errors = [])
    {
        parent::__construct($message, 0, 400);
        $this->errors = $errors;
    }

    public function getErrors()
    {
        return $this->errors;
    }
}

class NotFoundException extends ModuleException
{
    protected $statusCode = 404;
}

class UnauthorizedException extends ModuleException
{
    protected $statusCode = 403;
}
?>

Try-Catch Patterns

<?php
class UserService
{
    public function createUser($username, $email, $password)
    {
        try {
            // Validate
            $this->validate($username, $email, $password);

            // Create user
            $user = new User();
            $user->setUsername($username);
            $user->setEmail($email);
            $user->setPassword($password);

            // Save
            $userId = $this->userRepository->save($user);

            return $userId;

        } catch (ValidationException $e) {
            \xoops_logger()->error($e->getMessage());
            throw $e;

        } catch (\Exception $e) {
            \xoops_logger()->critical($e->getMessage());
            throw new \RuntimeException('Failed to create user');
        }
    }
}
?>

Logging Errors

<?php
class ErrorHandler
{
    public static function logError($message, $context = [])
    {
        \xoops_logger()->error($message, $context);
    }

    public static function logException(\Exception $e)
    {
        $context = [
            'exception' => get_class($e),
            'file' => $e->getFile(),
            'line' => $e->getLine(),
            'trace' => $e->getTraceAsString(),
        ];

        \xoops_logger()->critical($e->getMessage(), $context);
    }
}
?>

User-Friendly Error Messages

<?php
class ErrorHandler
{
    public static function getUserMessage(\Exception $e)
    {
        switch (true) {
            case $e instanceof ValidationException:
                return $e->getMessage();

            case $e instanceof NotFoundException:
                return 'The requested resource was not found.';

            case $e instanceof UnauthorizedException:
                return 'You do not have permission.';

            default:
                return 'An unexpected error occurred.';
        }
    }

    public static function getStatusCode(\Exception $e)
    {
        if (method_exists($e, 'getStatusCode')) {
            return $e->getStatusCode();
        }
        return 500;
    }
}
?>

Controller Error Handling

<?php
class UserController
{
    public function registerAction()
    {
        try {
            if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
                return [];
            }

            $userId = $this->userService->register(
                $_POST['username'],
                $_POST['email'],
                $_POST['password']
            );

            return ['success' => true, 'userId' => $userId];

        } catch (\Exception $e) {
            ErrorHandler::logException($e);

            return [
                'success' => false,
                'message' => ErrorHandler::getUserMessage($e),
                'statusCode' => ErrorHandler::getStatusCode($e),
            ];
        }
    }
}
?>

Best Practices

  • Create specific exception types
  • Throw early, catch late
  • Log all exceptions with context
  • Provide user-friendly messages
  • Use consistent error response format
  • Test error handling paths
  • Don't expose sensitive information to users

See also: - Code-Organization for project structure - Testing for error testing strategies - Service-Layer for service exceptions


Tags: #best-practices #error-handling #exceptions #logging #module-development