public class DeviceController {
public void sendShutDown() {
DeviceHandle handle = getHandle(DEV1);
if (handle != DeviceHandle.INVALID) {
retrieveDeviceRecord(handle);
if (record.getStatus() != DEVICE_SUSPENDED) {
pauseDevice(handle);
}
clearDeviceWorkQueue(handle);
}
}
}
오류가 발생했을 때, 오류 코드를 반환하는 대신 예외를 던지라는 권고를 강조함.
예외 처리는 오류 발생 시 프로그램이 비정상적인 상태를 유지하지 않고, 오류 상황을 명확하게 알리는 데 효과적임.
단위 테스트와 예외 처리
@Test(expected = FileNotFoundException.class)
public void testFileNotFound() throws FileNotFoundException {
new FileInputStream("없는 파일.txt");
}
// 확인된 예외: FileNotFoundException
try {
FileInputStream stream = new FileInputStream("file.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Try-Catch-Finally 사용
try {
FileInputStream stream = new FileInputStream("file.txt");
stream.read();
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
System.out.println("파일 처리를 종료합니다.");
}
예외 처리를 위한 try-catch-finally 구문을 사용하여, 코드가 실행 도중 오류가 발생하더라도 정상적으로 종료되도록 하는 구문.
특히 파일 입출력 등에서 중요한 역할을 함.
TDD(Test-Driven Development)와 예외 처리
public void retrieveData(String filePath) throws FileNotFoundException {
try {
FileInputStream stream = new FileInputStream(filePath);
// 데이터 처리 로직
} catch (FileNotFoundException e) {
throw new StorageException("파일을 찾을 수 없음", e);
}
}
테스트 주도 개발(TDD)에서 예외 처리를 명확하게 정의하는 것이 중요.
미리 정의한 테스트 케이스를 기반으로 예외 상황을 처리하는 방식임.
예외 메시지 제공
예외 흐름 정의
try {
FileInputStream stream = new FileInputStream("file.txt");
} catch (FileNotFoundException e) {
System.out.println("파일을 찾지 못했습니다: " + e.getMessage());
}
예외가 발생했을 때, 충분한 정보가 포함된 예외 메시지를 제공해야 문제 해결이 쉬워짐.
구체적인 오류 메시지를 통해 디버깅을 용이하게 만듦.
특수 사례 패턴(Special Case Pattern)
public class NullMealExpenses implements MealExpenses {
@Override
public int getTotal() {
return 0; // 기본값 제공
}
}
public void processTransaction() {
try {
executePayment();
} catch (PaymentException e) {
handlePaymentError(e);
}
}
비즈니스 로직과 오류 처리 흐름을 명확히 구분해야 함을 설명함.
예외 처리는 오류를 캡슐화하고, 비즈니스 로직은 정상적인 동작을 처리해야 함.
특수 상황을 처리하기 위한 패턴으로, 예상된 오류 상황에 대비한 코드를 미리 작성하는 방식임.
이를 통해 예외가 발생하지 않더라도 기본 동작을 제공할 수 있음.
Null 반환하지 않기
Null 전달하지 않기
public List<Employee> getEmployees() {
if (noEmployeesAvailable()) {
return Collections.emptyList(); // null 대신 빈 리스트 반환
}
return employeeList;
}
public double calculateDistance(Point p1, Point p2) {
if (p1 == null || p2 == null) {
throw new IllegalArgumentException("Point cannot be null");
}
return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));
}
메서드에서 null을 반환하지 말고, 대신 emptyList와 같은 안전한 대체 값을 반환해야 함.
null 값을 메서드 인수로 전달하지 말고, 대신 합리적인 기본값을 제공
이를 통해 NullPointerException을 방지할 수 있음.
null 관련 예외 발생을 방지해야 함을 설명함.