Handle Exceptions

EzyFox Server provides 3 way to help you handle exception easily

1. Use default exception

EzyFox Server provide to you EzyBadRequestException as a default exception. It will handle this exception and response the err command to client. Example this code fragment:
@EzyDoHandle(Commands.CHAT_TO_ME)
public ChatResponse chatToMe(ChatRequest request) {
    if (EzyStrings.isBlank(request.getWho())) {
        throw new EzyBadRequestException(400, "badRequest");
    }
    return new ChatResponse(greeting.greet(request.getWho()));
}
EzyFox Server will cacth the exception and handle it to return to client command error with data like this:
[400, badRequest]
You can find out full source code in ChatRequestController example.

2. Handle exception in a controller

If your exception only happends in a controller scope, you should handle it in that controller like this:
@EzyRequestController
public class ChatRequestController extends EzyLoggable {

    // request handlers
    
    @EzyTryCatch(BadWhoRequestException.class)
    public void handle(
            BadWhoRequestException e,
            EzyUser user,
            String cmd, 
            Object data) {
        logger.error("try cath BadWhoRequestException, cmd: {}, data: {}", cmd, data, e);
        responseFactory.newObjectResponse()
            .command(EzyResponseCommands.ERROR)
            .data(EzyEntityObjects.newObject("who", "invalid"))
            .user(user)
            .execute();
    }
}
You can find out full source code in ChatRequestController example.

3. Handle exceptions in a global handler

If your exceptions happend in many controller, and you want to save time and avoid source code duplication, you can create a global handler class to handle that exceptions like this:
@AllArgsConstructor
@EzyExceptionHandler
public class GlobalExceptionHandler extends EzyLoggable {

    private final EzyResponseFactory responseFactory;
    
    @EzyTryCatch(InvalidChatRequestException.class)
    public void handle(
        InvalidChatRequestException e,
        EzyUserSessionEvent event,
        String command,
        Object request
    ) {
        logger.info("invalid chat request, command: {}, data: {}", command, request, e);
        responseFactory.newObjectResponse()
            .command(EzyResponseCommands.ERROR)
            .data(EzyEntityObjects.newObject("request", "invalid"))
            .session(event.getSession())
            .execute();
    }
    
    @EzyTryCatch(IllegalArgumentException.class)
    public void handle(
            IllegalArgumentException e,
            EzySession session,
            String cmd, 
            @EzyRequestData Object data
    ) {
        logger.error("try cath IllegalArgumentException, cmd: {}, data: {}", cmd, data, e);
        responseFactory.newObjectResponse()
            .command(EzyResponseCommands.ERROR)
            .data(EzyEntityObjects.newObject("arguments", "invalid"))
            .session(session)
            .execute();
    }
    
    @EzyTryCatch(Exception.class)
    public void handle(
            Exception e,
            String cmd, 
            @EzyRequestData Object data
    ) throws Exception {
        throw e;
    }
}
You can find out full source code in GlobalExceptionHandler example.

Next step

You can choose a way to login to EzyFox Server