[1] 소스코드 분석-Try-Catch 예외처리
반응형
- 2025.01.07 -
} catch (Exception e) {
System.err.print(e.getMessage());
}
안전하지 않는 예외처리 디버그 코드
예외 발생 시 getMessage()를 이용한 오류 메세지를 통해 오류와 관련된 시스템 정보 등 민감한 정보가 유출될 수 있다.
이때, 사용하는 호출코드에 따라 세부내역의 정도가 다른데
getMessage < toString < printStackTrace
순서 이며 각각의 설명은 아래와 같다.
1. e.getMessage()
- 역할
예외 객체에 설정된 메시지(상세 메시지, detail message)를 String 형태로 반환합니다. - 출력 예시
try { // 어떤 예외가 발생 } catch (Exception e) { System.out.println(e.getMessage()); }
- 출력
"Index out of bounds" 와 같이 예외가 담고 있는 메시지 문자열만 나타남(구체적인 예외 유형, 스택 정보 등은 제외). - 장점 및 특징
- 예외의 “내용”만 간단히 알고 싶을 때 사용.
- 가장 적은 정보를 출력.
2. toString()
- 역할
예외 클래스의 이름(fully-qualified name)과 예외 메시지를 합쳐 문자열로 반환합니다. (주로 클래스명: 상세메시지 형태) - 출력 예시
try {
// 어떤 예외가 발생
} catch (Exception e) {
System.out.println(e.toString());
}
- 출력 "java.lang.IndexOutOfBoundsException: Index out of bounds" 식의 형태.
- 장점 및 특징
- getMessage()보다 조금 더 구체적 정보(예외 클래스명 포함).
- 예외 발생 원인(메시지)과 예외 유형(클래스)이 모두 필요할 때 유용.
3. printStackTrace()
- 역할
예외의 스택 트레이스(Stack Trace)를 표준 오류 스트림(기본적으로 콘솔)에 출력합니다.
예외가 발생하게 된 메서드(호출 스택)들을 추적할 수 있어, 디버깅에 가장 많이 활용됩니다. - 출력 예시
try {
// 어떤 예외가 발생
} catch (Exception e) {
e.printStackTrace();
}
-
- 출력(예시):
java.lang.IndexOutOfBoundsException: Index out of bounds at com.example.MyClass.myMethod(MyClass.java:10) at com.example.Main.main(Main.java:5)
- 예외의 발생 지점, 호출 스택, 클래스·메서드 정보 등이 포함.
- 출력(예시):
- 장점 및 특징
- 가장 자세한 예외 정보를 얻을 수 있어, 문제 해결 시 핵심적.
- 에러 메시지와 클래스명 뿐 아니라 발생 지점(라인 번호 등)까지 알 수 있어 디버깅에 필수적.
- getMessage()
- 예외 메시지 문자열만을 반환.
- toString()
- 예외 클래스의 이름 + 예외 메시지를 합쳐 문자열로 반환.
- printStackTrace()
- 예외 클래스명, 메시지, 호출 스택 정보(어느 라인에서, 어떤 메서드에서 발생했는지)까지 모두 출력.
대응 방안
catch (IOException e)
{
//오류와 관련된 최소한의 정보만을 제공하도록 조치
logger.error("IOException Occured");
}
try-catch를 이용해 예외처리가 필요하다면 최소한의 정보만 로그에 기록 및 출력하도록 하여 공격자가 이를 통해 다른 정보를 확보할 수 없도록 조치가 필요합니다.
반응형