중급 TypeScript - 오류 처리: 예외 처리
오류 처리: 예외 처리
오류 처리는 프로그램이 실행되는 동안 발생할 수 있는 다양한 문제를 관리하는 방법입니다. TypeScript에서는 이러한 오류를 효과적으로 다루기 위해 여러 가지 메커니즘을 제공합니다. 이 과정에서 예외 처리는 중요한 역할을 합니다. 예외 처리는 코드 실행 중에 발생하는 비정상적인 상황(예: 잘못된 입력, 네트워크 오류 등)을 관리하기 위한 기법입니다.
1. 오류의 종류
- 구문 오류(Syntax Errors): 문법 규칙을 위반했을 때 발생합니다.
- 논리 오류(Logical Errors): 코드가 문법적으로 올바르지만 예상한 대로 작동하지 않을 때 발생합니다.
- 런타임 오류(Runtime Errors): 프로그램이 실행 중에 발생하는 에러로, 예외가 던져질 수 있습니다.
2. try-catch 구문
TypeScript에서 예외 처리를 수행하기 위해 가장 일반적으로 사용하는 방법은 try-catch
블록입니다.
function divide(a: number, b: number): number {
try {
if (b === 0) {
throw new Error("0으로 나눌 수 없습니다."); // 사용자 정의 예외 던지기
}
return a / b;
} catch (error) {
console.error(error.message); // 에러 메시지를 콘솔에 출력
return NaN; // 실패 시 NaN 반환
}
}
console.log(divide(10, 2)); // 5
console.log(divide(10, 0)); // "0으로 나눌 수 없습니다."
위의 코드는 두 숫자를 나누는 함수입니다. 만약 분모가 0일 경우에는 Error
객체를 생성하여 사용자에게 적절한 메시지를 제공하고 있습니다.
3. finally 블록
finally
블록은 try-catch
구조에서 항상 실행되는 부분으로, 리소스를 정리하거나 마지막 작업을 수행할 때 유용합니다.
function readFile(filePath: string): string | null {
let fileContent = '';
try {
// 파일 읽기 로직 (실제로는 fs 모듈 등을 사용할 것)
if (!filePath) throw new Error("파일 경로가 필요합니다.");
fileContent = "파일 내용"; // 여기서 실제 파일 내용을 읽어야 함
} catch (error) {
console.error(error.message);
return null;
} finally {
console.log("파일 읽기 시도 완료");
}
return fileContent;
}
여기서는 파일을 읽으려는 시도를 하고 있으며, 성공 여부와 관계없이 항상 "파일 읽기 시도 완료"
라는 메시지가 출력됩니다.
4. 사용자 정의 예외 클래스 만들기
TypeScript에서는 특정 상황에 대한 보다 명확한 에러 관리를 위해 사용자 정의 예외 클래스를 만들 수도 있습니다.
class CustomError extends Error {
constructor(message: string) {
super(message);
this.name = 'CustomError';
}
}
function checkAge(age: number): void {
if (age < 18) {
throw new CustomError("성인이 아닙니다.");
}
}
try {
checkAge(15);
} catch (error) {
if (error instanceof CustomError) {
console.error(`사용자 정의 에러 발생: ${error.message}`);
} else {
console.error(`알 수 없는 에러 발생`);
}
}
위 코드에서는 사용자가 정의한 CustomError
클래스를 통해 연령 검증 기능을 구현했습니다. 이 방식은 더 구체적이고 이해하기 쉬운 에러 핸들링이 가능하게 합니다.
요약
오류 및 예외 처리는 안정적인 소프트웨어 개발의 핵심 요소입니다. TypeScript에서는 다양한 도구와 기법들을 통해 이를 쉽게 구현할 수 있도록 지원합니다:
- try-catch 구문으로 런타임 중의 문제를 포착하고,
- finally 블록으로 항상 필요한 후처리를 보장하며,
- 사용자 정의 클래스를 통해 더욱 세부적인 제어가 가능합니다.
이를 통해 개발자는 애플리케이션의 신뢰성을 높이고 유지보수를 용이하게 할 수 있습니다.