javascript- try-catch

현우.·2024년 6월 18일

JavaScript

목록 보기
20/31
post-thumbnail

try-catch문

에러가 발생했을때 에러를 잡아 어플리케이션이 강제종료되지 않고 catch문의 코드블록에 있는 코드가 수행되어 에러를 처리한다.

  • try문은 실행할 코드 블록을 정의한다.
  • catch문은 에러를 처리하기 위한 코드 블록을 정의한다.

try-catch문 알고리즘

try {

    //  실행할 코드들
  
  } catch (error) {
  
    // 에러를 처리하는 코드들
 
  }
  1. try{..} 안의 코드 실행
  2. 에러가 있다면 try 코드 실행이 중지되고, catch(error)블록으로 넘어간다.
    변수 error는 어떤 에러가 발생했는지에 대한 정보를 나타내는 객체이다.
  3. 에러가 없다면 try 코드가 끝까지 실행되고 catch 블록은 건너뛴다.
try {

    console.log('hi');
    hello;
    console.log('How are you?');
  
  } catch (err) {
  
        console.log('변수 선언이 안된 에러 발생 ');
  
  }
// 출력: 변수 선언이 안된 에러 발생 


1)서버로 부터 잘못된 JSON파일을 디코딩할때 에러 발생시 try-catch문 사용

let json ="{name khw}"; //  잘못 전달된 JSON파일

try {

    let user = JSON.parse(json);
    console.log(user.name); // 에러 발생
  
  } catch (err) {
  
        console.log(err.name); // SyntaxError
        console.log(err.message); 
        // Expected property name or '}' in JSON at position 1
  
  }

2)제대로 된 JSON파일을 받았지만 parse로 객체화된 객체에 없는 프로퍼티를 가져올 경우

let json = '{ "age": 30 }';

try {

  let user = JSON.parse(json); // 에러 없음
  console.log( user.name ); //  undefined
  

} catch (error) {
  console.log( "실행되지 않습니다." );
}

에러 발생을 유발하지만 코드 자체에는 에러가 발생하지 않아 catch문으로 넘어가지 않는다.

3) ‘throw’ 연산자 사용

throw 연산자는 에러를 생성한다.

  • 문법은 throw new Error객체 생성자
  • Error 객체 생성자에는 Error, SyntaxError,ReferenceError,TypeError등이 있다.
let json = '{ "age": 30 }';

try {

  let user = JSON.parse(json); // <-- 에러 없음
  if(!user.name){
    throw new Error('name프로퍼티는 없다!');
  }
  console.log( user.name ); // undefined 지만 코드 자체에서 에러가 발생하지는 않음


} catch (error) {
  console.log(error.name); // Error
  console.log(error.message); //  name프로퍼티는 없다!
}
  • 에러를 throw해 catch문으로 이동하면 catch문의 인자에 에러 객체가 들어오고
    에러 객체는 name,message프로퍼티를 이용할 수 있다.
  • name 프로퍼티는 생성자 이름과 동일한 값을 갖는다(Error,SyntaxError..)
  • message 프로퍼티는 에러 객체 생성자의 인수에서 가져온다.

try-catch-finally

try..catch는 finally라는 코드 절을 하나 더 가질 수 있다.

-finally안의 코드는 에러가 있든 없든 모든 상황에서 실행되는 코드이다.

  • try문이나 catch문이 끝나고 가장 마지막에 실행된다.

에러 다시 던지기

예상치 못한 또 다른 에러가 try {...} 블록 안에서 발생 할 수도 있다.

let json = '{ "age": 30 }'; // 불완전한 데이터
try {

  let user = JSON.parse(json);

  if (!user.name) {
    throw new SyntaxError("불완전한 데이터: 이름 없음");
  }

  blabla(); // 예상치 못한 에러

  console.log( user.name );

} catch(e) {

  if (e instanceof SyntaxError) {
    console.log( "JSON Error: " + e.message );
  } else {
    throw e; // 에러 다시 던지기 (*)
  }

}
  • ‘다시 던지기’ 기술
    1. catch가 모든 에러를 받는다.
    2. catch(err) {...} 블록 안에서 에러 객체 err를 분석한다.
    3. 알고있는 에러만 처리하고 나머지는 에러 처리 방법을 알지 못하면 throw err를 한다.
  • catch문에서 던진 에러는 try-catch 밖으로 던져지는데 밖에 try-catch문이 있으면 거기서 에러를 잡고, 없으면 스크립트는 죽는다.
  • 따라서 catch 블록에선 어떻게 다룰지 알고 있는 에러만 처리하고, 알 수 없는 에러는 건너 뛸 수 있다.

알 수 없는 에러는 건너뛰는 예제

function readData(){
    let json = '{ "age": 30 }'; // 불완전한 데이터
   
    try {
      // ...
      blabla(); // 에러(Reference Error)
    } catch (e) {
      // ...
      if (!(e instanceof SyntaxError)) {
        throw e; // 알 수 없는 에러 다시 던지기
      }
    }
}

try{
    readData();
} catch(e){
    console.log("에러를 잡았다! " + e); 
  // 에러를 잡았다! ReferenceError: blabla is not defined
}
profile
학습 기록.

0개의 댓글