Exception과 Error
Exception
- 예상 불가능한 오류 상황
- 파일을 정상적으로 읽어오지 못했거나, 네트워크 오류, 메모리 부족 등
- 발생시 프로그램 실행이 중단된다.
Error
- 예상 가능한 Error State(4XX, 5XX 에러)
- 일반적으로 프로그램 실행중 발생 가능한 문제를 나타내는 객체
- 다양한 Error객체가 존재한다. (TypeError, ReferenceError, SyntaxError 등)
- 시스템 에러, 메모리 에러, 문법 에러 등
발생 가능한 예외에 대해 무작정 try-catch문이나 throw new Error()로 예외처리를 하기보다는
예상 가능한 예외라면 Error State를 정의해서 예상 가능한 에러 상황으로 간주해서 상황에 맞춰 각기 다른 처리를 해주는것이 좋다.
문제가 발생하지 않을 상황(happy path)만을 가정하고 코드를 짠 뒤에 그 외의 상황에서 발생하는 에러는 모두 예외로 생각하고 예외 처리를 해야하는 곳에서 제대로 처리하지 않는다면, 에러가 상위 레벨로 계속 던져질것이다. 프로그램 안정성과 사용성에 문제가 있을뿐더러 유지보수에도 좋지 않다.
에러 핸들링 방법
1. try-catch문을 사용
try {
// 에러가 발생할 가능성이 있는 코드
let result = riskyFunction();
} catch (error) {
// 에러 처리 코드
console.error("오류 발생:", error.message);
} finally {
// 항상 실행되는 코드 (선택적)
console.log("처리 완료");
}
2. throw문 사용
예상치 못한 에러인 경우 throw new Error()를 사용할수있다.
특정 조건에서 에러를 수동으로 발생시키고자 할때 사용
function checkValue(value) {
if (value < 0) {
throw new Error("값은 0 이상이어야 합니다.");
}
return value;
}
try {
checkValue(-1);
} catch (error) {
console.error(error.message);
}
3. Promise와 async/await에서 에러 핸들링
비동기 함수 에러 처리시 try-catch문을 사용
async function fetchData() {
try {
let response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error('네트워크 응답이 좋지 않습니다.');
}
let data = await response.json();
return data;
} catch (error) {
console.error("데이터를 가져오는 중 오류 발생:", error.message);
}
}
에러 핸들링 해야하는 상황
에러핸들리은 에러 발생 가능성이 있는 부분에서 사용한다.
예를 들어 API호출, 파일 입출력, DB 쿼리 등 외부와 상호작용하는 부분에서 사용할수있을것이다.
에러 발생 가능한 부분을 try로 감싼다.
try {
let response = await fetch('https://api.example.com/data');
let data = await response.json();
} catch (error) {
console.error("API 호출 중 오류 발생:", error.message);
}
비동기 작업에서 에러를 처리
async function fetchData() {
try {
let response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error('네트워크 오류');
}
let data = await response.json();
return data;
} catch (error) {
console.error("데이터 가져오기 중 오류 발생:", error.message);
}
}
또한 자원을 연결하고 해제할때
let connection;
try {
connection = openDatabaseConnection();
// 데이터베이스 작업 수행
} catch (error) {
console.error("데이터베이스 오류:", error.message);
} finally {
if (connection) {
closeDatabaseConnection(connection);
}
}
class Connection {
attempt(): void {
throw new Error('인터넷에 연결할 수 없습니다!');
}
}
class AuthenticationService {
constructor(private connection: Connection) { }
authenticate() {
try {
this.connection.attempt();
// 인증 로직...
} catch (error) {
console.error("인증 중 오류 발생:", error.message);
// 사용자에게 오류 메시지 표시
}
}
}
class Application {
constructor(private authService: AuthenticationService) { }
start() {
try {
this.authService.authenticate();
} catch (error) {
console.error("애플리케이션 실행 중 오류 발생:", error.message);
// 사용자에게 오류 메시지 표시
}
}
}
// 인스턴스 생성 및 실행
const connection = new Connection();
const authService = new AuthenticationService(connection);
const app = new Application(authService);
app.start();
Connection클래스의 attempt() 함수는 인터넷 연결이 되지 않은 상황을 가정해서 에러를 던지도록 만들어져있다.
그래서 attempt()함수를 사용하는 부분은 모두 try-catch로 에러핸들링을 하였다.
'develop > JavaScript' 카테고리의 다른 글
axios의 onUploadProgress (요청 응답 시간 확인) (0) | 2024.11.08 |
---|---|
POST로 파일, 이미지, JSON 데이터 보내기 (0) | 2024.11.08 |