wampy 2023. 3. 12. 21:34

1. 복구 가능성

  • 오류가 발생했을 때 무엇을 할 것인지 결정하기 위해서는
  • 자신의 코드가 어떻게 사용될지 신중하게 생각해야 함

복구 가능한 오류

  • 잘못된 사용자 입력
  • 네트워크 오류
    • 몇 초 동안 기다렸다가 다시 시도
    • 사용자에게 다시 확인하도록 요청
  • 중요하지 않은 작업 오류

복구할 수 없는 오류

  • 코드와 함께 추가되어야 하는 리소스가 없음
  • 어떤 코드가 다른 코드를 잘못 사용함...

호출하는 쪽에서만 오류 복구 가능 여부를 알 때가 많음

  • 대부분의 오류는 한 코드가 다르코드를 호출할 떄 발생
  • 오류상황을 처리할 때는 신중하게
    • 오류로부터 복구하기를 호출하는 쪽에서 원하는가?
    • 만약 그렇다면 오류를 처리할 필요가 있다는 것을 호출하는 쪽에서는 어떻게 알 수 있을까

호출하는 쪽에서 복구하고자 하는 오류에 대해 인지하도록

  • 이 함수에서 오류가 발생할 수 있따는 가능성을 호출하는 쪽에서 확실하게 인지하도록 해야 함

2. 견고성 vs 실패

  • 오류가 발생할 떄
    • 실패 -> 전체 프로그램의 작동을 멈추게 함
    • 오류를 처리하고 계속 진행

신속하게 실패하라

  • failing fast
    • 가능한 한 문제의 실제 발생 지점으로부터 가까운 곳에서 오류를 나타내는 것
  • 복구할 수 있는 오류의 경우
    • 호출하는 쪽에서 오류로부터 훌륭하고 안전하게 복구할 수 있는 기회를 제공
  • 복구할 수 없는 오류의 경우
    • 개발자가 문제를 신속하게 파악하고
    • 해결할 수 있는 기회를 최대한 제공

오류를 숨기지 않음

  • 코드의 독립적이거나 중요하지 않은 부분을 분리하는 것이 필요
  • 높은 계층의 코드에서 이루어져야 함

기본값 반환

  • 오류가 발생하고 함수가 원하는 값을 반환할 수 없는 경우 기본값을 반환하는 방법
  • 문제점
    • 오류가 발생했다는 사실을 숨김

아무것도 하지 않음...

  • 오류가 발생했다는 신호를 보내지 않음
  • 바람직하지 않다
  •  

3. 오류 전달 방법

  • 더 높은 계층으로 오류를 알려야 함
  • 복구할 수 없는 경우
    • 프로그램의 훨씬 더 높은 층에서 실행을 중지하고
    • 오류를 기록하거나 전체 프로그램의 실행을 종료하는 것으 ㄹ의미
  • 오류를 알리는 방법
    • 명시적 방법
      • 코드를 직접 호출한 쪽에서 오류가 발생할 수 있음을 인지할 수밖에 없도록 한다
      • 검사 예외, 널 반환 유형, 옵셔널 반환 유형, 리절트 반환 유형, 아웃컴 반환 유형
    • 암시적 방법
      • 코드를 호출하는 쪽에 오류를 알리지만
      • 호출하는 쪽에서는 그 오류를 신경쓰지 않아도 됨
      • 비검사 예외, 매직값 반환, 프로미스 또는 퓨처, 어서션, 체크, 패닉

예외

  • 코드에서 오류나 예외적인 상황이 발생한 경우 이를 전달하기 위한 방법으로 고안됨
  • 더 이상 올라갈 콜 스택이 없는 경우....

명시적 방법 : 검사 예외

  • 컴파일러는 검사 예외에 대해 호출하는 쪽에서 예외를 인지하도록 강제적으로 조치하는데
  • 호출하는 쪽에서는 예외 처리를 위한 코드를 작성하거나
  • 자신의 함수 시그니처에 해당 예외를 선언해야 함

암시적 방법 : 비검사 예외

  • 오류가 발생할 수 있다는 것을 호출하는 쪼 ㄱ에서인지하리라는 보장이 없기 떄문에
  • 오류를 암시적으로 알리는 방법

Checked exception, Unchecked exception

  • 클라이언트가 예외에서 복구할 것으로 합리적으로 예상할 수 있는 경우 이를 checked exception 으로 만드십시오.
  • 클라이언트가 예외에서 복구하기 위해 아무 것도 할 수 없으면 확인되지 않은 unchecked exception 으로 만드십시오
    • Java에서 확인되지 않은 몇 가지 일반적인 예외는 NullPointerException , ArrayIndexOutOfBoundsExceptionIllegalArgumentException 입니다 .
    • RuntimeException 상속

명시적 방법 : 널값이 가능한 반환 유형

  • 널값을 이용한 오류를 전달하는 방법
// 제공되는 값이 음수면 널을 반환
Double? getSquareROot(Double value) {
    if (value < 0.0) {
        return null;
    }
    return Math.sqrt(value);
}

명시적 방법 : 리절트 반환 유형

  • 굳이 이렇게...?
  • 번거로운듯.....
  •  

복구할 수 없는 오류의 전달

  • 요란하게 실패하자...
  • 비검사 예외를 발생
  • 체크나 어서션을 사용

호출한느 쪽에서 복구하기를 원할 수도 있는 오류의 전달

비검사 예외?

코드 구조 개선

  • 대부분의 오류 처리가 코드의 상위 계층에서 이루어질 수 있기 떄문에
  • 비검사 예외를 발생시키면 코드 구조를 개선할 수 있다?

명시적 방식을 사용하자

  • 당연히 에러 띄워야하는거 아닌가...