Java 예외 처리 - 네트워크 예제 리팩토링 2
이전 작성글의 리팩토링한 코드에서 개선사항이 있었다.
개선사항
- 예외 처리가 없으므로 복구되지 않았다. 예외 발생 반드시 종료된다.
- 사용 후 반드시 disconnect() 호출하여 연결을 해제해주어야 한다.
NetworkClientException.class
public class NetworkClientException extends Exception {
private String errorCode;
public NetworkClientException(String errorCode, String message) {
super(message);
this.errorCode = errorCode;
}
// 에러 코드 조회하기
public String getErrorCode() {
return errorCode;
}
}
참고
- 파라미터로 들어온 message는 super 키워드로 Exception 상위 생성자로 생성하는 것을 볼 수 있다.
- super 키워드로 인해 상위 생성자를 호출하고 message 는 detailMessage 필드로 저장된다.
NetworkClient.class
public class NetworkClient {
private final String address;
public boolean connectError;
public boolean sendError;
public NetworkClient(String address) {
this.address = address;
}
public void connect() throws NetworkClientException {
// exception error
if (connectError) {
throw new NetworkClientException("connectError", "Connect Open Failed");
}
// Connect Success
System.out.println(address + " Connect Open Success");
}
public void send(String message) throws NetworkClientException {
if (sendError) {
throw new NetworkClientException("sendError", "Send Failed");
}
// 전송 성공
System.out.println(address + " Send Message data: " + message);
}
public void disconnect() {
System.out.println(address + " Connect Closed Success");
}
public void initError(String data) {
if (data.contains("error1")) {
connectError = true;
}
if (data.contains("error2")) {
sendError = true;
}
}
}
NetworkService.class
public class NetworkService {
public void sendMessage(String data) throws NetworkClientException {
String address = "http://kiioio.com";
NetworkClient client = new NetworkClient(address);
client.initError(data); // 오류 코드로 반환.
client.connect();
client.send(data);
client.disconnect();
}
private static boolean isError(String connectResult) {
return !connectResult.equals("success");
}
}
Main.class
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws NetworkClientException {
NetworkService networkService = new NetworkService();
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.print("Send Message data: ");
String input = scanner.nextLine();
if (input.equals("exit")) {
break;
}
networkService.sendMessage(input);
System.out.println();
}
System.out.println("네트워크 프로그램 종료");
}
}
NetworkService 코드에서 예외 처리가 없으므로 무조건 던지도록 되어있다.
아래와 같이 try ~ catch 문법을 사용하여 에러를 처리하는 로직으로 바꿔주자.
리팩토링 1
Network.Service.class
public class NetworkService {
public void sendMessage(String data) throws NetworkClientException {
String address = "http://kiioio.com";
NetworkClient client = new NetworkClient(address);
client.initError(data); // 오류 코드로 반환.
try {
client.connect();
} catch (NetworkClientException e) {
System.out.println("[Error] Code: " + e.getErrorCode() + ", Message: " + e.getMessage());
return;
}
try {
client.send(data);
} catch (NetworkClientException e) {
System.out.println("[Error] Code: " + e.getErrorCode() + ", Message: " + e.getMessage());
return;
}
client.disconnect();
}
private static boolean isError(String connectResult) {
return !connectResult.equals("success");
}
}
Send Message data: error1
[Error] Code: connectError, Message: Connect Open Failed
Send Message data: error2
http://kiioio.com Connect Open Success
[Error] Code: sendError, Message: Send Failed
Send Message data: open
http://kiioio.com Connect Open Success
http://kiioio.com Send Message data: open
http://kiioio.com Connect Closed Success
- try ~ catch 문으로 connect(), send() 메소드와 같이 예외 발생 포인트로 잡았다.
- 예외를 잡은 경우 오류 코드와 메시지 출력하기
- 예외로 잡아 처리하였기에 정상 흐름으로 복귀한다.
- 예외가 잡힌 경우 return 메소드에서 빠져나온다.
개선사항 체크하기
- 예외 처리가 없으므로 복구되지 않았다. 예외 발생 반드시 종료된다. -> 해결
- 사용 후 반드시 disconnect() 호출하여 연결을 해제해주어야 한다. -> 해결안됨
- 예외 처리 했으나 정상, 예외 흐름이 두 개가 생겨 가독성이 저하되었다 -> 신규개선