본문 바로가기

블록체인 기반 핀테크 및 응용 SW개발자 양성과정 일기

[35일차 복습 및 정리] JavaScript try... catch... finally 란? 사용법, 특징, 예외처리, throw도 함께 써보기 연습

반응형

 try .. catch... finally   

 

1. 기본 frame

try{

    내가 실행할 코드 

}catch(e){   // e 또는 err 또는 error 아무거나 변수명으로 입력!

    코드에 에러가 발생되면 여기에 실행할 코드 (error handling)

}

1. 설명 

1. try { ... } 의 코드 실행

-> 에러가 없다면 try 만 실행하고 catch는 건너 뛴다. 

-> 에러가 있다면 -> 

2. try{ ... } 코드 실행이 중단되고 catch{ ... } 로 제어 흐름이 넘어감.  -> 에러가 나도 catch에서 에러 처리하기 때문에 스크립트는 죽지 않는다. 

 

try 안의 코드를 실행, 예외(exception)이 발생(throw) 할 경우의 응답을 지정한다. 

throw = 예외가 발생하는 경우 무엇을 할지 명시하는 코드를 포함한다. 

 

1. try.. catch

2. try..finally

3. try..catch..finally 

요렇게 3가지 방식으로 쓸 수 있다.  try 중첩문도 가능하다. 

 

2. * try.. catch 특징 

오직 실행 가능한 Runnable 코드에서만 동작한다. 괄호 실수 등 문법적으로 잘못된 경우 tyr..catch가 동작하지 않는다.  이처럼 유효한 코드에서 발생하는 에러만 처리할 수 있다. 이러한 에러는 Runtime error, 런타임 에러 or Exception, 예외라고 부른다. 

 

 

try { } 에 오류가 없는 경우

try{
    console.log('try block start');

    console.log('try block end');
}catch(e){
    console.log('error');
}

 

 

 

 

 

 

 

 

 

try { } 안에 오류가 있는 경우 - 정의되지않은 변수 만들어주기

try{
    console.log('try block start');
    hihi;
    console.log('try block end');
}catch(e){
    console.log('error');
}

 

 

 

 

 

 

 

 

실행 불가능한 에러 경우

try{
    console.log('try block start');
    hihi;
    console.log('try block end');
}catch(e){
    console.log('error');
}}}}

 

3.  setTimeout처럼 scheduled 된 코드에서 발생한 예외는 try..catch에서 잡아 낼 수 없다. 

(예외처리 경우만. try 안의 구문에 에러가 없으면 상관 없음) 

try{
    setTimeout(function(){
        noSuchVariable;
    },1000)
}catch(e){
    console.log('error났다');
}

 

 

 

 

 

 

 

 

 

try 안에 오류가 없다면 아래처럼 상관 없다. 

try{
    setTimeout(function(){
        console.log('a');
    },1000)
}catch(e){
    console.log('error났다');
}

 

 

 

 

 

 

 

 

try..catch 와 setTimeout 과 같은 scheduled 구문을 함께 쓰고 싶을 땐 

setTimeout(function(){
try{
        noSuchVariable;
}catch(e){
    console.log('error났다');
}},1000)

 

setTimeout 함수를 try...catch 전체를 감싸주면 된다. 

 

 

 

 

 

 

 

 

4. 에러가 나면 JS는 에러 상세 내용이 담긴 객체를 생성 -> catch 블록에 이 객체를 인수 전달함. 

try{
    noSuchVariable;   정의되지 않은 변수; - 고의로 에러 내기 
}catch(e){ 
    console.log(e);
    console.log(e.name);
    console.log(e.message);
    console.log(e.stack);
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5. catch 뒤에 (e) 는 생략 가능 (최신버젼)

try{
    noSuchVariable;
}catch{
    console.log('error!')
}

 

 

 

 

 

 

 

 

 

----------------------------------------------------------try catch 실습 ------------------------------------------------------

 

처음 try...catch...finally를 접했을 때 어려웠는데 아래의 실습 (?) 연습을 해보았더니 이제 이해가 된다. 

아래 코드들을 직접 타이핑하고 결과값을 확인하면서 익혀보기를 추천! 

 

 

try{
    notExistentFunction();
}catch(error){
    console.log(error);
}

notExistentFunction() 함수를 실행해라! -> 함수가 정의된 게 없음 -> error 를 catch 해서 {console.log(error)}를 실행 : 

 

 

 

 

 

 

 

 

 

 

 

try{
    let A = '안녀엉ㅇ'
    console.log(A)
}catch(e){
    console.log(e);    
}

 

 

 에러가 없어서 try 문만 실행됨 

 

 

 

 

 

 

 

let req = undefined;
try{
    if(req==undefined){
        throw undefined;
    }
}catch(e){
    console.log('value : ', e);
}

 

req == undefined 라면 undefined 를 throw to e ? 

throw 

 

 

 

 

 

 

여기서 살짝 헷갈리는데 throw 가 뭔고 하니 throw [any Object] <- 요 부분을 catch (error) <- 여기로 넣어라 같다. 

Throw! 던지고 Catch! 잡는 세트같음.

 

 

 

 

 

 

 

 

more examples ↓↓↓↓

try{
    throw 1;
}catch(e){
    console.log(e);
}

 

 

 

 

 

 

 

 

 

let req = 1;
try{
    if(req==undefined){
        throw undefined;
    }
    console.log('hello')
}catch(e){
    console.log('value : ', e);
}

 

req는 undefined 가 아니므로 if 문을 pass, console.log('hello')를 찍음. 

catch는 오류일 때라서 pass! 

 

 

 

 

 

 

 

let req = 1;
try{
    if(req==1){
        throw undefined;              // throw 가 실행되면 바로 catch! 로 가기 
    }
    console.log('hello')
}catch(e){
    console.log('value : ', e);
}

 

req==1 이라면 throw 해라 undefined를 to e로  그리고 try 구문에서 나가라! 라는 뜻으로 해석됨 

 

 

 

 

 

 

--------------------------------------------함수 안에서 try...catch문 만들어 보기 ---------------------------------------------

 

function f (){
    try{
        console.log(0);
        throw "error";     // "error" 를 e 로 넣어라 
    }catch(e){
        console.log(1);
        console.log(e);
        return true;
    }
}

 

 

console.log에 f()를 입력해보면 

결과값이 요렇게 나온다. 

 

 

 

 

 

 

 

 

function f (){
    try{
        console.log(0);
        throw "error";
    }catch(e){
        console.log(1);
        console.log(e);
        return 3;
    }
}

 

return 뒤 나오는 것을 출력 

 

 

 

 

 

 

 

 

 

function f (){
    try{
        console.log(0);
        throw "error";         // throw 라는 구문 이 있으면 try 안 오류 없어도 error를 
    }catch(e){                 // catch 구문의 인자값 e로 넣고 실행해 ! 라는 뜻 
        console.log(1);
        console.log(e);
        return true;
    }finally{
        console.log('the end');
    }
}

 

try 문에 오류가 없어도 throw 실행하면 catch 로 이어짐 

 

 

 

 

 

 

 

 

 

 

 

function f (){
    try{
        console.log(0);
        // throw "error";       try 안 에러가 없을 때 throw 도 없으면 catch구문 실행x 
    }catch(e){
        console.log(1);
        console.log(e);
        return true;
    }finally{
        console.log('the end');
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

function f (){
    try{
        console.log(0);
        throw "error";
    }catch(e){
        console.log(1);
        console.log(e);
        return true;
    }finally{
        console.log('the end');
        return false;
    }
}

 

 

catch 끝에 return 

finally 끝에 return 

 

finally 마지막에 나온걸로 실행됨 

 

 

 

 

 

function f (){
    try{
        console.log(0);
        throw "error";
    }catch(e){
        console.log(1);
        console.log(e);
        return true;
    }finally{
        console.log('the end');

    }
}

 

 

catch 안에 return 있는데 

return 값이 가장 마지막에 나오는 걸 알 수 있다. 

 

 

 

 

 

 

 

 

function f (){
    try{
        console.log(0);
        throw "error";
        console.log('나도 log해쥬!');   // logged 되지 않는다. 
    }catch(e){
        console.log(1);
        console.log(e);
        return true;
    }finally{
        console.log('the end');
    }
}

-> throw 이후의 구문들 ( only in try문) 은 실행이 안되고 바로 catch로 간다. 

 

 

let req = undefined;
try{
    console.log('How are you');
    if(req==undefined) throw "I'm good here.";
    console.log('How about you');   // throw 로 인해 제어가 catch로 넘어감 
}catch(e){
    console.log(e);
}

 

 

 

 

 

 

 

 

let req = undefined;
try{
    console.log('How are you');
    if(req==undefined) throw "I'm good here.";
    console.log('How about you');
}catch(e){
    console.log(e);
}finally{
    console.log("I'm happy for you")
}

 

 

 

 

 

 

 

 

 

let req = 1;
try{
    console.log('How are you');
    if(req==undefined) throw "I'm good here.";
    console.log('not good');
}catch(e){
    console.log(e);
}finally{
    console.log("I'm happy for you")
}

 

 

finally 는 결과값 상관없이 모두 실행됨! 

 

 

 

 

 

 

 

 

 

 

 

반응형