wampy
2023. 3. 12. 21:34
1. 복구 가능성
- 오류가 발생했을 때 무엇을 할 것인지 결정하기 위해서는
- 자신의 코드가 어떻게 사용될지 신중하게 생각해야 함
복구 가능한 오류
- 잘못된 사용자 입력
- 네트워크 오류
- 몇 초 동안 기다렸다가 다시 시도
- 사용자에게 다시 확인하도록 요청
- 중요하지 않은 작업 오류
복구할 수 없는 오류
- 코드와 함께 추가되어야 하는 리소스가 없음
- 어떤 코드가 다른 코드를 잘못 사용함...
호출하는 쪽에서만 오류 복구 가능 여부를 알 때가 많음
- 대부분의 오류는 한 코드가 다르코드를 호출할 떄 발생
- 오류상황을 처리할 때는 신중하게
- 오류로부터 복구하기를 호출하는 쪽에서 원하는가?
- 만약 그렇다면 오류를 처리할 필요가 있다는 것을 호출하는 쪽에서는 어떻게 알 수 있을까
호출하는 쪽에서 복구하고자 하는 오류에 대해 인지하도록
- 이 함수에서 오류가 발생할 수 있따는 가능성을 호출하는 쪽에서 확실하게 인지하도록 해야 함
2. 견고성 vs 실패
- 오류가 발생할 떄
- 실패 -> 전체 프로그램의 작동을 멈추게 함
- 오류를 처리하고 계속 진행
신속하게 실패하라
- failing fast
- 가능한 한 문제의 실제 발생 지점으로부터 가까운 곳에서 오류를 나타내는 것
- 복구할 수 있는 오류의 경우
- 호출하는 쪽에서 오류로부터 훌륭하고 안전하게 복구할 수 있는 기회를 제공
- 복구할 수 없는 오류의 경우
- 개발자가 문제를 신속하게 파악하고
- 해결할 수 있는 기회를 최대한 제공
오류를 숨기지 않음
- 코드의 독립적이거나 중요하지 않은 부분을 분리하는 것이 필요
- 높은 계층의 코드에서 이루어져야 함
기본값 반환
- 오류가 발생하고 함수가 원하는 값을 반환할 수 없는 경우 기본값을 반환하는 방법
- 문제점
- 오류가 발생했다는 사실을 숨김
아무것도 하지 않음...
- 오류가 발생했다는 신호를 보내지 않음
- 바람직하지 않다
3. 오류 전달 방법
- 더 높은 계층으로 오류를 알려야 함
- 복구할 수 없는 경우
- 프로그램의 훨씬 더 높은 층에서 실행을 중지하고
- 오류를 기록하거나 전체 프로그램의 실행을 종료하는 것으 ㄹ의미
- 오류를 알리는 방법
- 명시적 방법
- 코드를 직접 호출한 쪽에서 오류가 발생할 수 있음을 인지할 수밖에 없도록 한다
- 검사 예외, 널 반환 유형, 옵셔널 반환 유형, 리절트 반환 유형, 아웃컴 반환 유형
- 암시적 방법
- 코드를 호출하는 쪽에 오류를 알리지만
- 호출하는 쪽에서는 그 오류를 신경쓰지 않아도 됨
- 비검사 예외, 매직값 반환, 프로미스 또는 퓨처, 어서션, 체크, 패닉
- 명시적 방법
예외
- 코드에서 오류나 예외적인 상황이 발생한 경우 이를 전달하기 위한 방법으로 고안됨
- 더 이상 올라갈 콜 스택이 없는 경우....
명시적 방법 : 검사 예외
- 컴파일러는 검사 예외에 대해 호출하는 쪽에서 예외를 인지하도록 강제적으로 조치하는데
- 호출하는 쪽에서는 예외 처리를 위한 코드를 작성하거나
- 자신의 함수 시그니처에 해당 예외를 선언해야 함
암시적 방법 : 비검사 예외
- 오류가 발생할 수 있다는 것을 호출하는 쪼 ㄱ에서인지하리라는 보장이 없기 떄문에
- 오류를 암시적으로 알리는 방법
Checked exception, Unchecked exception
- 클라이언트가 예외에서 복구할 것으로 합리적으로 예상할 수 있는 경우 이를 checked exception 으로 만드십시오.
- Java의 일부 일반적인 확인 예외는 IOException , SQLException 및 ParseException 입니다 .
- 클라이언트가 예외에서 복구하기 위해 아무 것도 할 수 없으면 확인되지 않은 unchecked exception 으로 만드십시오
- Java에서 확인되지 않은 몇 가지 일반적인 예외는 NullPointerException , ArrayIndexOutOfBoundsException 및 IllegalArgumentException 입니다 .
- RuntimeException 상속
명시적 방법 : 널값이 가능한 반환 유형
- 널값을 이용한 오류를 전달하는 방법
// 제공되는 값이 음수면 널을 반환
Double? getSquareROot(Double value) {
if (value < 0.0) {
return null;
}
return Math.sqrt(value);
}
명시적 방법 : 리절트 반환 유형
- 굳이 이렇게...?
- 번거로운듯.....
복구할 수 없는 오류의 전달
- 요란하게 실패하자...
- 비검사 예외를 발생
- 체크나 어서션을 사용
호출한느 쪽에서 복구하기를 원할 수도 있는 오류의 전달
비검사 예외?
코드 구조 개선
- 대부분의 오류 처리가 코드의 상위 계층에서 이루어질 수 있기 떄문에
- 비검사 예외를 발생시키면 코드 구조를 개선할 수 있다?
명시적 방식을 사용하자
- 당연히 에러 띄워야하는거 아닌가...