https://www.youtube.com/watch?v=o9JnT4sneAQ&list=PLxtfsEgwB_8fPhoDrX9QSJH8MWy0eLuLI&index=287
강의 정리본
에러는 발생을 해야 잡을 수 있다!
에러가 발생해서 바깥으로 나오는 것이 중요
function* map(f, iter) {
for(const a of iter) {
yield a instanceof Promise ? a.then(f) : f(a);
}
}
async function reduceAsync(f, acc, iter) {
for await (const a of iter) {
acc = f(acc, a);
}
return acc;
}
const f2 = imgs =>
reduceAsync((a, b) => a + b, 0,
map(img => img.height,
map({url}) => loadImage(url), imgs)));
f2(imgs).catch(_ => 0).then(log);
f2(imgs2).catch(_ => 0).then(log);
어떤 함수를 작성할 때 부수효과를 일으키는 건 그닥 좋은 코드가 아니다
imgs2 처럼 잘못된 인자를 전달할 수도 있는 개발자가! 에러 핸들링을 할 수 있도록 해야한다
미리 에러 핸들링 하는 것은 함수에 제약을 걸어두는 것 + 제대로 에러를 못 잡을 수도 있다
(오.... 그렇구나....)
# 정리
- Promise, async/await, try/catch 를 정확히 다루는 것이 중요
- 제너레이터/이터레이터/이터러블을 잘 응용하면 코드의 표현력을 더할 뿐 아니라 에러 핸들링도 더 잘할 수 있다
- 순수 함수에서는 에러가 발생되도록 그냥 두는 것이 낫다
- 에러 핸들링 코드는 부수효과를 일으킬 코드 주변에 작성하는게 좋다
- 불필요하게 에러 핸들링을 미리 해두는 것은 에러를 숨길 수 있다
ex) try-catch 문을 쓰고 아무것도 안하는 코드는 최악의 코드
최대한 바깥에서만 부수효과를 일으키는게 좋은 함수라고 생각한다... 고 말씀하심...!
어렵다...........!