자바스크립트
[JavaScript] 예외처리
코딩하는둥이
2025. 2. 20. 14:41
예외처리
실행중인 프로그램에서 예기치 못한 상황이 발생하여 더이상 진행하지 못 할때 처리할 수 있도록 한다.
만약에 서버 주소가 잘못되어 있다면 try catch 문을 통해 예외처리를 할 수 있다.
const h1El = document.querySelector('h1');
const ulEl = document.createElement('ul');
ulEl.classList.add('users');
document.body.append(ulEl);
h1El.addEventListener('click', async () => {
const loaderEl = document.createElement('div');
loaderEl.classList.add('loader');
ulEl.innerHTML = '';
ulEl.append(loaderEl);
try {
// 서버로부터 데이터 가져오기
const res = await fetch('https://jsonplaceholder.typicode.com/users'); // 테스트용 API
const data = await res.json();
console.log(data);
const users = data; // users 배열 데이터
const liEls = users.map((user) => {
const liEl = document.createElement('li');
liEl.textContent = user.name;
liEl.dataset.photo = user.photo?.url || 'https://via.placeholder.com/150'; // 기본 이미지 주소
if (!user.photo) {
liEl.classList.add('no-photo');
}
const loaderEl = document.createElement('div');
loaderEl.classList.add('loader');
liEl.prepend(loaderEl); // 이름 앞에 로더 추가
return liEl;
});
loaderEl.remove(); // 최상단 로더 제거
ulEl.append(...liEls); // li 요소 추가
// 각 사용자의 이미지를 비동기로 로드
liEls.forEach(async (liEl) => {
try {
const imgEl = await loadImage(liEl.dataset.photo);
liEl.prepend(imgEl); // 이미지 추가
} catch (error) {
console.error(error);
} finally {
const loader = liEl.querySelector('.loader');
if (loader) loader.remove(); // 로더 제거
}
});
} catch (error) {
console.error(error);
ulEl.textContent='사용자 정보를 찾을 수 없어요'
loaderEl.remove()
}
});
// 이미지 로드 함수
function loadImage(src) {
return new Promise((resolve, reject) => {
const imgEl = document.createElement('img');
imgEl.src = src;
imgEl.addEventListener('load', () => {
resolve(imgEl);
});
imgEl.addEventListener('error', () => {
reject(new Error(`Failed to load image: ${src}`));
});
});
}
Promise 작성 시에는 약속을 이행하지 못할 수 있을 때 reject를 추가해야 합니다.
매개변수
resolve - 약속을 이행하는 함수(정상 처리)
reject - 약속을 거부하는 함수 (에러 상황)
Pending : 약속이 이행되거나 거부되기 전 상태 (대기중)
Fulfilled - 약속이 이행된 상태
Rejected - 약속이 거부된 상태
function loadImage(src) {
return new Promise((resolve, reject) => {
const imgEl = document.createElement('img');
imgEl.src = src;
imgEl.addEventListener('load', () => {
resolve(imgEl);
});
imgEl.addEventListener('error', () => {
reject(new Error(`Failed to load image: ${src}`));
});
});
then
.then( 매개변수 =>{
약속이 이행되었을 때 호출
})
.catch( error => {
약속이 거부되었을 때 호출
})
finally() =>{
이행 및 거부와 상관없이 항상 호출하는 메소드 제공
}
try catch문
try{
에러(예외)가 발생할 수 있는 코드의 실행을 시도
}
catch{
에러가 발생하면 시도를 종료해 에러를 잡아낸다.
}
finally(erro){
에러 여부와 상관없이 항상 실행하는 토드를 정의
}