참고
예외
추상화 수준에 맞는 예외
NOTE
메서드가 던지는 예외가 해당 메서드가 속한 인터페이스 추상화 수준과 일치해야 한다
메서드가 저수준 예외를 처리하지 않고 바깥으로 전파해버리게 되면, 내부 구현 방식을 드러내어 윗 레벨 API를 오염시킵니다.
이 문제를 피하려면 상위 계층에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던져야 하며 이를 예외 번역이라 합니다.
추상화 수준은 인터페이스를 사용하는 클라이언트에게 노출되는 연산의 수준을 의미합니다.
•
ex) 고수준의 추상화를 제공하는 메서드는 파일 시스템이나 네트워크 통신같은 저수준 세부 사항을 숨겨야 합니다. 즉 SQLException, IOException을 직접 던지지 않아야 함을 의미합니다.
예외 반환은 저수준의 예외를 고수준에 맞춰서 변환해야 합니다.
•
try-catch에서 저수준 예외를 잡고, 현재 추상화 수준에 맞게 변환하여 던진다.
예외 포장은 예외 변환의 한 형태로, 발생한 예외를 더 추상적인 예외로 포장하여 던지는 기법입니다.
•
API 사용자는 내부 구현의 복잡성을 신경 쓰지 않고도 예외를 처리할 수 있습니다.
public class BankService {
public void withdraw(String accountId, double amount) throws InsufficientFundsException {
try {
// 데이터베이스에서 계좌 정보 조회 및 인출 로직
// 이 과정에서 DatabaseAccessException이 발생할 수 있음
checkBalanceAndWithdraw(accountId, amount);
} catch (DatabaseAccessException e) {
// 저수준 예외를 고수준 예외로 변환
throw new InsufficientFundsException("잔액이 부족합니다.", e);
}
}
private void checkBalanceAndWithdraw(String accountId, double amount) throws DatabaseAccessException {
// 실제 인출 로직 구현...
// 예를 들어, 데이터베이스 조회 결과 잔액이 인출 금액보다 적은 경우 DatabaseAccessException을 던짐
}
}
// 고수준 예외(DatabaseAccessException => InsufficientFundsException)
public class InsufficientFundsException extends Exception {
public InsufficientFundsException(String message, Throwable cause) {
super(message, cause);
}
}
// 저수준 예외
public class DatabaseAccessException extends Exception {
public DatabaseAccessException(String message) {
super(message);
}
}
Java
복사
예외를 무시하지 말자
NOTE
예외 처리를 설계하고 구현할 때, 발생할 수 있는 예외를 무시하거나 적절히 처리하지 않는 것은 애플리케이션의 안전성과 신뢰성을 해칠 수 있습니다.
핵심 요약
•
예외는 프로그램의 정상적인 흐름에서 벗어난 상황을 알리는 목적으로 설계되었습니다. 따라서 예외가 발생하면 프로그램이 제대로 실행되지 않고 있다는 신호입니다.
•
예외를 무시하는 것은 문제의 근본적인 원인을 해결하지 않고 두는 것으로, 이는 나중에 더 심각한 오류로 이어질 수 있습니다.
•
모든 예외를 로깅하고 복구와 알림 등의 조치를 시작해야 합니다. 때로는 예외를 무시하는 것이 적절할 수 있지만, 이 결정은 신중히 해야 합니다.
추가 고려 사항
•
예외가 제공하는 메시지나 스택 트레이스 등의 상세 정보를 활용해 문제를 해결해야 합니다.
•
사용자에게는 기술적인 메시지를 직접 보여주기보다는 사용자 친화적인 메시지로 전환해 보여주는 것이 좋습니다.
•
민감한 정보가 로그에 기록되지 않도록 주의해야 합니다.