const iterations = 1000000;// 테스트 1: try-catch 미사용console.time('무 try-catch');for (let i = 0; i < iterations; i++) { Math.sqrt(i);}console.timeEnd('무 try-catch');// 테스트 2: try-catch 사용, 하지만 예외를 던지지 않음console.time('유 try-catch, 예외 없음');for (let i = 0; i < iterations; i++) { try { Math.sqrt(i); } catch (e) { // 실행되지 않음 }}console.timeEnd('유 try-catch, 예외 없음');// 테스트 3: try-catch 사용, 매번 예외를 던짐 (반복 횟수가 훨씬 적음에 유의)console.time('유 try-catch, 매번 예외 발생');for (let i = 0; i < 10000; i++) { try { throw new Error('test'); } catch (e) { // 예외 처리 }}console.timeEnd('유 try-catch, 매번 예외 발생');시나리오 | 반복 횟수 | 소요 시간 |
|---|---|---|
무 try-catch | 1,000,000 | 1.8ms |
유 try-catch, 예외 없음 | 1,000,000 | 1.2ms |
유 try-catch, 매번 예외 발생 | 10,000 | 13.9ms |
// JSON 파싱은 실패할 수 있습니다.try { const data = JSON.parse(userInput); processData(data);} catch (e) { showError('입력 형식이 올바르지 않습니다');}// 네트워크 요청은 실패할 수 있습니다.try { const response = await fetch('/api/data'); const data = await response.json();} catch (e) { showError('네트워크 연결 실패');}// 잘못된 예시: 예외를 사용하여 사용자 존재 여부 판단function findUser(id) { try { return database.query(`SELECT * FROM users WHERE id = ${id}`); } catch (e) { return null; // "찾을 수 없음"을 반환하기 위해 예외 사용 }}// 올바른 방법function findUser(id) { const result = database.query(`SELECT * FROM users WHERE id = ${id}`); return result || null;}// 방식 1: 반복문 내부의 try-catchfor (const item of items) { try { processItem(item); } catch (e) { console.error('처리 실패:', item); }}// 방식 2: 반복문 외부의 try-catchtry { for (const item of items) { processItem(item); }} catch (e) { console.error('처리 실패:', e);}// 베스트 프랙티스 예시async function fetchUserData(userId) { if (!userId) { return null; // 먼저 확인, 예외 미사용 } try { const response = await fetch(`/api/users/${userId}`); if (!response.ok) { // HTTP 오류이지만, 반드시 예외는 아님 console.warn(`사용자 획득 실패: ${response.status}`); return null; } return await response.json(); } catch (e) { // 실제 예외: 네트워크 단절, JSON 파싱 실패 등 console.error('사용자 데이터 획득 예외 발생:', { userId, error: e.message, stack: e.stack }); throw e; // 필요에 따라 다시 던질지 결정 }}try-catch 자체는 현대 JavaScript 엔진에서 성능 오버헤드가 거의 없습니다. 실제로 성능에 영향을 주는 것은 예외의 발생과 포착인데, 이는 Error 객체 생성과 스택 추적 캡처가 필요하기 때문입니다. 따라서 try-catch는 정상적인 프로그램 흐름 제어가 아닌, 실제 예외 상황을 처리하는 데 사용할 것을 권장합니다. 예를 들어 사용자 입력 유효성 검사는 try-catch가 아닌 if 문으로 판단하는 것이 좋습니다.
아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!

더 적고, 더 긴 테스트를 작성하세요
Inkyu Oh • Front-End

타입 세이프한 합성 컴포넌트 만들기
Inkyu Oh • Front-End

Parcel을 이용한 React Server Components
Inkyu Oh • Front-End

fate
Inkyu Oh • Front-End