PHpullh

TYPESCRIPT · 심층 가이드

TypeScript 에러 처리 완전 정리

TypeScript는 던져지는 값의 타입을 검사해 주지 않기 때문에, catch로 잡은 값이 정말 Error라는 보장은 언어가 아니라 코드가 직접 만들어야 합니다.

주제 15개 · 예제 코드 포함 · 최종 수정 2026-08-30 · 작성 pullh 편집팀

다른 정적 타입 언어와 달리 TypeScript의 시그니처에는 어떤 오류가 나갈 수 있는지가 전혀 적히지 않습니다. throw는 문자열이든 객체든 무엇이든 던질 수 있고, 그래서 catch의 변수 타입도 unknown입니다. 여기서 초심자는 곧장 err.message를 읽으려다 막힙니다. 오류를 값으로 다룰지 예외로 던질지, 그리고 어느 경계에서 정체를 확인할지를 매번 스스로 정해야 하는 언어입니다.

try catch 기본에서 잡은 값의 정체를 좁히는 법을 익히고 나면, 사용자 정의 오류로 도메인마다 구분 가능한 타입을 세우는 이유가 드러납니다. 도메인 오류 표현은 그 클래스들을 판별 가능한 형태로 묶는 단계이고, Result 반환은 아예 예외를 쓰지 않고 성공과 실패를 같은 반환값 안에 담는 반대편 접근입니다. 마지막으로 입력 가드다단계 검증은 그 경계를 함수의 어느 지점에 둘지를 손으로 정해 보는 실습에 해당합니다.

finally 블록에서 return하면 진행 중이던 예외가 조용히 사라집니다. 정리 코드가 값을 돌려주는 순간 원래의 실패가 성공으로 뒤바뀌므로, finally에는 자원 해제만 두고 반환도 재던지기도 넣지 않는 편이 안전합니다. 잡은 값을 좁힐 때도 instanceof 하나만 믿기보다 필드 구조를 확인하는 가드를 함께 두면, 번들 경계나 워커를 넘나들며 프로토타입 사슬이 달라진 오류에서도 판정이 어긋나지 않습니다.

01try catch 기본

TypeScript에서 try catch 기본 개념을 코드로 빠르게 확인하는 에러 처리 예제입니다.

TypeScript code

// try catch 기본
try {
  JSON.parse("{");
} catch (error) {
  console.log(error instanceof Error ? error.message : String(error));
}
알아두면 좋은 점

실패를 잡는 것에서 끝내지 말고, 기록하고 복구하는 흐름까지 같이 읽는 것이 중요합니다.

자주 하는 실수

에러를 잡기만 하고 아무 처리도 하지 않으면 문제는 숨어 있고 복구는 더 어려워집니다.

02사용자 정의 오류

TypeScript에서 사용자 정의 오류 개념을 코드로 빠르게 확인하는 에러 처리 예제입니다.

TypeScript code

// 사용자 정의 오류
function requireName(name: string) {
  if (!name.trim()) throw new Error("name required");
  return name;
}
console.log(requireName("Ada"));
알아두면 좋은 점

실패를 잡는 것에서 끝내지 말고, 기록하고 복구하는 흐름까지 같이 읽는 것이 중요합니다.

자주 하는 실수

에러를 잡기만 하고 아무 처리도 하지 않으면 문제는 숨어 있고 복구는 더 어려워집니다.

03입력 검증

TypeScript에서 입력 검증 개념을 코드로 빠르게 확인하는 에러 처리 예제입니다.

TypeScript code

// 입력 검증
const parseNumber = (value: string) => {
  const parsed = Number(value);
  return Number.isNaN(parsed) ? null : parsed;
};
console.log(parseNumber("3"));
알아두면 좋은 점

실패를 잡는 것에서 끝내지 말고, 기록하고 복구하는 흐름까지 같이 읽는 것이 중요합니다.

자주 하는 실수

에러를 잡기만 하고 아무 처리도 하지 않으면 문제는 숨어 있고 복구는 더 어려워집니다.

04안전한 숫자 파싱

TypeScript에서 안전한 숫자 파싱 개념을 코드로 빠르게 확인하는 에러 처리 예제입니다.

TypeScript code

// 안전한 숫자 파싱
function assert(condition, message: string) {
  if (!condition) throw new Error(message);
}
assert(true, "must be true");
알아두면 좋은 점

실패를 잡는 것에서 끝내지 말고, 기록하고 복구하는 흐름까지 같이 읽는 것이 중요합니다.

자주 하는 실수

에러를 잡기만 하고 아무 처리도 하지 않으면 문제는 숨어 있고 복구는 더 어려워집니다.

05안전한 나눗셈

TypeScript에서 안전한 나눗셈 개념을 코드로 빠르게 확인하는 에러 처리 예제입니다.

TypeScript code

// 안전한 나눗셈
try {
  JSON.parse("{");
} catch (error) {
  console.log(error instanceof Error ? error.message : String(error));
}
알아두면 좋은 점

실패를 잡는 것에서 끝내지 말고, 기록하고 복구하는 흐름까지 같이 읽는 것이 중요합니다.

자주 하는 실수

에러를 잡기만 하고 아무 처리도 하지 않으면 문제는 숨어 있고 복구는 더 어려워집니다.

06finally 정리

TypeScript에서 finally 정리 개념을 코드로 빠르게 확인하는 에러 처리 예제입니다.

TypeScript code

// finally 정리
function requireName(name: string) {
  if (!name.trim()) throw new Error("name required");
  return name;
}
console.log(requireName("Ada"));
알아두면 좋은 점

실패를 잡는 것에서 끝내지 말고, 기록하고 복구하는 흐름까지 같이 읽는 것이 중요합니다.

자주 하는 실수

에러를 잡기만 하고 아무 처리도 하지 않으면 문제는 숨어 있고 복구는 더 어려워집니다.

07오류 다시 던지기

TypeScript에서 오류 다시 던지기 개념을 코드로 빠르게 확인하는 에러 처리 예제입니다.

TypeScript code

// 오류 다시 던지기
const parseNumber = (value: string) => {
  const parsed = Number(value);
  return Number.isNaN(parsed) ? null : parsed;
};
console.log(parseNumber("7"));
알아두면 좋은 점

실패를 잡는 것에서 끝내지 말고, 기록하고 복구하는 흐름까지 같이 읽는 것이 중요합니다.

자주 하는 실수

에러를 잡기만 하고 아무 처리도 하지 않으면 문제는 숨어 있고 복구는 더 어려워집니다.

08도메인 오류 표현

TypeScript에서 도메인 오류 표현 개념을 코드로 빠르게 확인하는 에러 처리 예제입니다.

TypeScript code

// 도메인 오류 표현
function assert(condition, message: string) {
  if (!condition) throw new Error(message);
}
assert(true, "must be true");
알아두면 좋은 점

실패를 잡는 것에서 끝내지 말고, 기록하고 복구하는 흐름까지 같이 읽는 것이 중요합니다.

자주 하는 실수

에러를 잡기만 하고 아무 처리도 하지 않으면 문제는 숨어 있고 복구는 더 어려워집니다.

09fallback 값 사용

TypeScript에서 fallback 값 사용 개념을 코드로 빠르게 확인하는 에러 처리 예제입니다.

TypeScript code

// fallback 값 사용
try {
  JSON.parse("{");
} catch (error) {
  console.log(error instanceof Error ? error.message : String(error));
}
알아두면 좋은 점

실패를 잡는 것에서 끝내지 말고, 기록하고 복구하는 흐름까지 같이 읽는 것이 중요합니다.

자주 하는 실수

에러를 잡기만 하고 아무 처리도 하지 않으면 문제는 숨어 있고 복구는 더 어려워집니다.

10assertion

TypeScript에서 assertion 개념을 코드로 빠르게 확인하는 에러 처리 예제입니다.

TypeScript code

// assertion
function requireName(name: string) {
  if (!name.trim()) throw new Error("name required");
  return name;
}
console.log(requireName("Ada"));
알아두면 좋은 점

실패를 잡는 것에서 끝내지 말고, 기록하고 복구하는 흐름까지 같이 읽는 것이 중요합니다.

자주 하는 실수

에러를 잡기만 하고 아무 처리도 하지 않으면 문제는 숨어 있고 복구는 더 어려워집니다.

11Result 반환

TypeScript에서 Result 반환 개념을 코드로 빠르게 확인하는 에러 처리 예제입니다.

TypeScript code

// Result 반환
const parseNumber = (value: string) => {
  const parsed = Number(value);
  return Number.isNaN(parsed) ? null : parsed;
};
console.log(parseNumber("11"));
알아두면 좋은 점

실패를 잡는 것에서 끝내지 말고, 기록하고 복구하는 흐름까지 같이 읽는 것이 중요합니다.

자주 하는 실수

에러를 잡기만 하고 아무 처리도 하지 않으면 문제는 숨어 있고 복구는 더 어려워집니다.

12다단계 검증

TypeScript에서 다단계 검증 개념을 코드로 빠르게 확인하는 에러 처리 예제입니다.

TypeScript code

// 다단계 검증
function assert(condition, message: string) {
  if (!condition) throw new Error(message);
}
assert(true, "must be true");
알아두면 좋은 점

실패를 잡는 것에서 끝내지 말고, 기록하고 복구하는 흐름까지 같이 읽는 것이 중요합니다.

자주 하는 실수

에러를 잡기만 하고 아무 처리도 하지 않으면 문제는 숨어 있고 복구는 더 어려워집니다.

13로깅 래퍼

TypeScript에서 로깅 래퍼 개념을 코드로 빠르게 확인하는 에러 처리 예제입니다.

TypeScript code

// 로깅 래퍼
try {
  JSON.parse("{");
} catch (error) {
  console.log(error instanceof Error ? error.message : String(error));
}
알아두면 좋은 점

실패를 잡는 것에서 끝내지 말고, 기록하고 복구하는 흐름까지 같이 읽는 것이 중요합니다.

자주 하는 실수

에러를 잡기만 하고 아무 처리도 하지 않으면 문제는 숨어 있고 복구는 더 어려워집니다.

14recover 흐름

TypeScript에서 recover 흐름 개념을 코드로 빠르게 확인하는 에러 처리 예제입니다.

TypeScript code

// recover 흐름
function requireName(name: string) {
  if (!name.trim()) throw new Error("name required");
  return name;
}
console.log(requireName("Ada"));
알아두면 좋은 점

실패를 잡는 것에서 끝내지 말고, 기록하고 복구하는 흐름까지 같이 읽는 것이 중요합니다.

자주 하는 실수

에러를 잡기만 하고 아무 처리도 하지 않으면 문제는 숨어 있고 복구는 더 어려워집니다.

15입력 가드

TypeScript에서 입력 가드 개념을 코드로 빠르게 확인하는 에러 처리 예제입니다.

TypeScript code

// 입력 가드
const parseNumber = (value: string) => {
  const parsed = Number(value);
  return Number.isNaN(parsed) ? null : parsed;
};
console.log(parseNumber("15"));
알아두면 좋은 점

실패를 잡는 것에서 끝내지 말고, 기록하고 복구하는 흐름까지 같이 읽는 것이 중요합니다.

자주 하는 실수

에러를 잡기만 하고 아무 처리도 하지 않으면 문제는 숨어 있고 복구는 더 어려워집니다.

정리하며

  • catch의 값은 unknown이므로 message를 읽기 전에 좁힙니다.
  • finally에서 return하면 예외가 삼켜지니 정리 코드만 둡니다.
  • 복구 가능한 실패는 예외 대신 Result로, 버그성 상태는 즉시 던져 구분합니다.
  • 사용자 정의 오류에 코드 필드를 두어 메시지 문자열 비교에 의존하지 않게 합니다.

더 깊이 들어가고 싶다면 TypeScript 학습 라이브러리에서 다른 주제 가이드를 이어서 보거나, 언어 비교에서 같은 개념이 다른 언어에서 어떻게 표현되는지 확인해 보세요.