Backend'de Özel Hata Sınıfları: Standart Exceptions'tan Neden Uzaklaşmalı
Genellikle `Exception` veya `RuntimeException` kullanmak kolay gelir. Ama backend'de bu yaklaşım sorun çıkarır. Standart hatalar ne tür bir sorun olduğunu anlatmaz, hata işleme zorlaşır ve loglama karmaşık hale gelir.
Örneğin bir API isteğinde kullanıcı bulunamazsa, veritabanı bağlantısı koptuğunda veya izin yetersiz olduğunda, hepsi farklı durumlardır. Ama standart `Exception` ile bunları ayırt edemezsiniz.
İlk olarak tüm özel hatalar için bir ana sınıf yazarsınız:
1public class ApplicationException extends RuntimeException {2private final String errorCode;3private final int httpStatus;45public ApplicationException(String errorCode, String message, int httpStatus) {6super(message);7this.errorCode = errorCode;8this.httpStatus = httpStatus;9}1011public String getErrorCode() {12return errorCode;13}1415public int getHttpStatus() {16return httpStatus;17}18}Her duruma özgü hata sınıfları oluşturun:
1public class UserNotFoundException extends ApplicationException {2public UserNotFoundException(Long userId) {3super("USER_NOT_FOUND", 4"Kullanıcı bulunamadı: " + userId, 5404);6}7}89public class InsufficientPermissionException extends ApplicationException {10public InsufficientPermissionException(String resource) {11super("INSUFFICIENT_PERMISSION", 12"Bu işlem için yetkiniz yok: " + resource, 13403);14}15}1617public class DatabaseException extends ApplicationException {18public DatabaseException(String message) {19super("DATABASE_ERROR", message, 500);20}21}Kodunuzda bu hataları fırlatın:
1public User getUserById(Long userId) {2return userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException(userId));3}45public void deleteUser(Long userId, User currentUser) {6if (!currentUser.isAdmin()) {7throw new InsufficientPermissionException("user_delete");8}9userRepository.deleteById(userId);10}Global hata işleyicide yakalayın:
1@RestControllerAdvice2public class GlobalExceptionHandler {34@ExceptionHandler(ApplicationException.class)5public ResponseEntity<?> handleApplicationException(ApplicationException ex) {6Map<String, Object> response = new HashMap<>();7response.put("error_code", ex.getErrorCode());8response.put("message", ex.getMessage());9return ResponseEntity.status(ex.getHttpStatus()).body(response);10}11}Çıktı (404 durumunda):
1{2"error_code": "USER_NOT_FOUND",3"message": "Kullanıcı bulunamadı: 123"4}- Loglama: Hata koduna göre filtrele ve takip et.
- İstemci: Doğru HTTP status ve hata kodu alır.
- Hata işleme: Her duruma farklı davran.
- Bakım: Kodun ne demek istediği açıktır.
Özel hatalar, backend'in dilini konuşmasını sağlar.
0 yorum