throw_in_finally 진단: finally 블록에서 예외를 던지면 안 돼요

throw_in_finally 진단: finally 블록에서 예외를 던지면 안 돼요

throw_in_finallyfinally 블록 안에서 예외를 던지는 코드를 Dart 분석기가 알려주는 린트(lint) 규칙이에요. 실행에 문제가 생기는 건 아니지만, finally 블록에서 예외를 던지면 디버깅하기 어려운 예상치 못한 동작을 부르게 돼요.

출처: throw_in_finally

본문

설명

finally 블록 안에서 예외를 던지는 것은 피해야 해요 (AVOID). finally 블록에서 예외를 던지면 어쩔 수 없이 예상치 못한 동작이 생기고, 그 원인을 찾는 것도 매우 어려워져요.

좋지 않은 코드 (BAD)

class BadThrow {
  double nonCompliantMethod() {
    try {
      print('hello world! ${1 / 0}');
    } catch (e) {
      print(e);
    } finally {
      throw 'Find the hidden error :P'; // LINT
    }
  }
}

좋은 코드 (GOOD)

finally 블록에서는 예외를 던지지 않고, 필요한 값은 반환으로 넘겨요.

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

규칙 활성화하기

analysis_options.yaml 파일의 linter > rules 아래에 throw_in_finally를 추가해서 활성화할 수 있어요.

linter:
  rules:
    - throw_in_finally

YAML 맵 문법으로 설정하고 있다면 linter > rules 아래에 throw_in_finally: true를 추가해요.

linter:
  rules:
    throw_in_finally: true

더 알아보기