finally 블록에서는 흐름 제어를 피해 주세요
finally 블록에서는 흐름 제어를 피해 주세요
finally 블록 안에서 return, continue, break 같은 흐름 제어를 쓰면 예상치 못한 동작이 생겨서 디버깅이 어려워져요. 이 규칙은 그런 패턴을 피하도록 도와줘요.
본문
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