finally 블록에서는 흐름 제어를 피해 주세요

finally 블록에서는 흐름 제어를 피해 주세요

finally 블록 안에서 return, continue, break 같은 흐름 제어를 쓰면 예상치 못한 동작이 생겨서 디버깅이 어려워져요. 이 규칙은 그런 패턴을 피하도록 도와줘요.

출처: Avoid control flow in finally blocks

본문

finally 블록을 탈출하는 흐름 제어는 피해 주세요.

finally 블록 안에서 흐름 제어를 사용하면 디버깅하기 어려운 예상치 못한 동작이 생기기 마련이에요.

BAD:

class BadReturn {
  double nonCompliantMethod() {
    try {
      return 1 / 0;
    } catch (e) {
      print(e);
    } finally {
      return 1.0; // LINT
    }
  }
}

BAD:

class BadContinue {
  double nonCompliantMethod() {
    for (var o in [1, 2]) {
      try {
        print(o / 0);
      } catch (e) {
        print(e);
      } finally {
        continue; // LINT
      }
    }
    return 1.0;
  }
}

BAD:

class BadBreak {
  double nonCompliantMethod() {
    for (var o in [1, 2]) {
      try {
        print(o / 0);
      } catch (e) {
        print(e);
      } finally {
        break; // LINT
      }
    }
    return 1.0;
  }
}

GOOD:

class Ok {
  double compliantMethod() {
    var i = 5;
    try {
      i = 1 / 0;
    } catch (e) {
      print(e); // OK
    }
    return i;
  }
}

활성화 방법

control_flow_in_finally 규칙을 활성화하려면 analysis_options.yaml 파일의 linter > rules 아래에 control_flow_in_finally를 추가하면 돼요.

linter:
  rules:
    - control_flow_in_finally

대신 YAML map 문법으로 린트 규칙을 설정한다면 linter > rules 아래에 control_flow_in_finally: true를 추가하면 돼요.

linter:
  rules:
    control_flow_in_finally: true

더 알아보기