diff --git a/src/main/java/school/hei/vola/endpoint/rest/controller/ErrorHandler.java b/src/main/java/school/hei/vola/endpoint/rest/controller/ErrorHandler.java
new file mode 100644
index 0000000..64ed4d3
--- /dev/null
+++ b/src/main/java/school/hei/vola/endpoint/rest/controller/ErrorHandler.java
@@ -0,0 +1,37 @@
+package school.hei.vola.endpoint.rest.controller;
+
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import school.hei.vola.endpoint.rest.security.UnauthorizedException;
+
+@ControllerAdvice
+public class ErrorHandler {
+
+ @ExceptionHandler(NotFoundException.class)
+ public String handleNotFoundException(Model model, HttpServletResponse response) {
+ model.addAttribute("status", HttpServletResponse.SC_NOT_FOUND);
+ model.addAttribute("error", "Not Found");
+ model.addAttribute("errorMessage", "La ressource demandée est introuvable");
+ response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+ return "error";
+ }
+
+ @ExceptionHandler(UnauthorizedException.class)
+ public String handleUnauthorizedException(Model model, HttpServletResponse response) {
+ model.addAttribute("status", HttpServletResponse.SC_UNAUTHORIZED);
+ model.addAttribute("error", "Unauthorized");
+ model.addAttribute("errorMessage", "Accès non autorisé");
+ response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+ return "error";
+ }
+
+ @ExceptionHandler(Exception.class)
+ public String handleException(Exception ex, Model model, HttpServletResponse response) {
+ var message = ex.getMessage() != null ? ex.getMessage() : ex.getClass().getSimpleName();
+ model.addAttribute("errorMessage", message);
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ return "error";
+ }
+}
diff --git a/src/main/resources/templates/error.html b/src/main/resources/templates/error.html
new file mode 100644
index 0000000..e65015d
--- /dev/null
+++ b/src/main/resources/templates/error.html
@@ -0,0 +1,55 @@
+
+
+
+ Vola - Erreur
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/java/school/hei/vola/endpoint/rest/controller/ErrorHandlerTest.java b/src/test/java/school/hei/vola/endpoint/rest/controller/ErrorHandlerTest.java
new file mode 100644
index 0000000..8d31406
--- /dev/null
+++ b/src/test/java/school/hei/vola/endpoint/rest/controller/ErrorHandlerTest.java
@@ -0,0 +1,67 @@
+package school.hei.vola.endpoint.rest.controller;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.*;
+
+import jakarta.servlet.http.HttpServletResponse;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.ui.Model;
+
+class ErrorHandlerTest {
+
+ private ErrorHandler errorHandler;
+ private Model model;
+ private HttpServletResponse response;
+
+ @BeforeEach
+ void setUp() {
+ errorHandler = new ErrorHandler();
+ model = mock(Model.class);
+ response = mock(HttpServletResponse.class);
+ }
+
+ @Test
+ void handleException_setsStatus500_andErrorMessage() {
+ var exception = new RuntimeException("Test error");
+
+ var result = errorHandler.handleException(exception, model, response);
+
+ assertEquals("error", result);
+ verify(response).setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ verify(model).addAttribute("errorMessage", "Test error");
+ }
+
+ @Test
+ void handleException_withNullMessage_usesClassName() {
+ var exception = new RuntimeException((String) null);
+
+ var result = errorHandler.handleException(exception, model, response);
+
+ assertEquals("error", result);
+ verify(response).setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ verify(model).addAttribute("errorMessage", "RuntimeException");
+ }
+
+ @Test
+ void handleNotFoundException_setsStatus404() {
+ var result = errorHandler.handleNotFoundException(model, response);
+
+ assertEquals("error", result);
+ verify(response).setStatus(HttpServletResponse.SC_NOT_FOUND);
+ verify(model).addAttribute("status", HttpServletResponse.SC_NOT_FOUND);
+ verify(model).addAttribute("error", "Not Found");
+ verify(model).addAttribute("errorMessage", "La ressource demandée est introuvable");
+ }
+
+ @Test
+ void handleUnauthorizedException_setsStatus401() {
+ var result = errorHandler.handleUnauthorizedException(model, response);
+
+ assertEquals("error", result);
+ verify(response).setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+ verify(model).addAttribute("status", HttpServletResponse.SC_UNAUTHORIZED);
+ verify(model).addAttribute("error", "Unauthorized");
+ verify(model).addAttribute("errorMessage", "Accès non autorisé");
+ }
+}