TypeScript 오류 처리 초보자 가이드
효과적인 오류 처리가 모든 프로그래밍 언어에서 중요하며 TypeScript도 예외는 아닙니다. 적절한 오류 처리가 예상치 못한 조건을 우아하게 관리하여 견고하고 신뢰할 수 있는 애플리케이션을 만드는 데 도움이 됩니다. 이 가이드에서는 TypeScript에서 오류 처리의 기본 사항을 다루고 초보자를 위한 실제 예를 제공합니다.
TypeScript의 오류 이해
TypeScript의 오류는 JavaScript와 마찬가지로 런타임 또는 컴파일 타임에 발생합니다. TypeScript는 컴파일 타임에 많은 잠재적 문제를 포착할 수 있는 유형 안전성을 제공하지만, 런타임 오류는 여전히 적절하게 관리해야 합니다.
try
및 catch를 사용한 기본 오류 처리
TypeScript에서는 try
및 catch
블록을 사용하여 런타임 오류를 처리합니다. 이 접근 방식을 사용하면 오류를 발생시킬 수 있는 코드를 실행하고 오류가 발생하면 해당 오류를 처리할 수 있습니다.
try
및 catch의 예
function divide(a: number, b: number): number {
try {
if (b === 0) {
throw new Error("Cannot divide by zero");
}
return a / b;
} catch (error) {
console.error(error.message);
return NaN; // Return NaN to indicate an error
}
}
console.log(divide(10, 2)); // Output: 5
console.log(divide(10, 0)); // Output: Cannot divide by zero
이 예에서 divide
함수는 두 숫자를 나누려고 시도합니다. 나누는 수가 0이면 오류가 발생하고 catch
블록에서 catch하여 오류 메시지를 기록합니다.
사용자 정의 오류 유형
TypeScript를 사용하면 사용자 정의 오류 유형을 정의하여 특정 오류 조건을 더 잘 표현할 수 있습니다. 사용자 정의 오류 유형은 오류를 분류하고 보다 효과적으로 처리하는 데 도움이 됩니다.
사용자 정의 오류 유형 만들기
class DivisionError extends Error {
constructor(message: string) {
super(message);
this.name = "DivisionError";
}
}
function divide(a: number, b: number): number {
try {
if (b === 0) {
throw new DivisionError("Cannot divide by zero");
}
return a / b;
} catch (error) {
if (error instanceof DivisionError) {
console.error(`Custom Error: ${error.message}`);
} else {
console.error("An unexpected error occurred");
}
return NaN; // Return NaN to indicate an error
}
}
console.log(divide(10, 2)); // Output: 5
console.log(divide(10, 0)); // Output: Custom Error: Cannot divide by zero
여기서 우리는 내장된 Error
클래스를 확장하는 사용자 정의 오류 클래스 DivisionError
를 정의합니다. 우리는 divide
함수에서 이 사용자 정의 오류를 사용하여 더 구체적인 오류 처리를 제공합니다.
instanceof를 사용한 유형 보호
instanceof
와 같은 유형 가드는 catch
블록에서 오류 객체의 유형을 좁히는 데 도움이 되므로 다양한 오류 유형을 다르게 처리할 수 있습니다.
유형 보호의 예
function processInput(input: string | number) {
try {
if (typeof input === "string") {
console.log(input.toUpperCase());
} else {
throw new Error("Input must be a string");
}
} catch (error) {
if (error instanceof Error) {
console.error(`Error: ${error.message}`);
} else {
console.error("An unknown error occurred");
}
}
}
processInput("hello"); // Output: HELLO
processInput(42); // Output: Error: Input must be a string
이 예제는 catch
블록에서 유형을 보호하여 오류 객체가 Error
의 인스턴스가 되도록 보장하고 정확한 오류 처리를 가능하게 하는 방법을 보여줍니다.
정리를 위해 finally
사용
finally
블록은 오류가 발생했는지 여부와 관계없이 실행해야 하는 코드를 실행하는 데 사용할 수 있습니다. 이는 파일을 닫거나 리소스를 해제하는 것과 같은 정리 작업에 유용합니다.
finally를 사용한 예
function readFile(filePath: string): string {
try {
// Simulate reading a file
if (filePath === "") {
throw new Error("File path cannot be empty");
}
return "File content";
} catch (error) {
console.error(`Error: ${error.message}`);
return "";
} finally {
console.log("Cleanup: Closing file");
}
}
console.log(readFile("path/to/file")); // Output: File content
console.log(readFile("")); // Output: Error: File path cannot be empty
// Cleanup: Closing file
이 예에서 finally
블록은 오류가 발생했는지 여부에 관계없이 정리 메시지가 기록되도록 합니다.
결론
효과적인 오류 처리가 신뢰할 수 있는 TypeScript 애플리케이션을 구축하는 데 필수적입니다. try
및 catch
, 사용자 정의 오류 유형, 유형 보호 및 finally
를 사용하면 오류를 보다 효과적으로 관리하고 예상치 못한 상황에서도 애플리케이션이 예측 가능하게 동작하도록 할 수 있습니다.
이러한 기술을 사용하면 오류를 우아하게 처리하고 TypeScript 코드의 견고성을 개선할 수 있습니다. 이러한 개념을 연습하여 TypeScript 오류 처리에 능숙해지고 더 탄력적인 애플리케이션을 작성하세요.