kgneng2 / blokg

blog
MIT License
0 stars 0 forks source link

try..catch와 에러핸들링 #18

Open kgneng2 opened 4 years ago

kgneng2 commented 4 years ago

image

에러 객체

try {
  lalala; // 에러, 변수가 정의되지 않음!
} catch(err) {
  alert(err.name); // ReferenceError  
  alert(err.message); // lalala is not defined
  alert(err.stack); // ReferenceError: lalala is not defined at ... (호출 스택 디버깅용으로 사용)

  // 에러 전체를 보여줄 수도 있습니다.
  // 이때, 에러 객체는 "name: message" 형태의 문자열로 변환됩니다.
  alert(err); // ReferenceError: lalala is not defined
}

선택적 'catch' 바인딩

try {
  // ...
} catch { // <-- (err) 없이 쓸 수 있음
  // ...
}

'throw' 연산자

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

try {
  let user = JSON.parse(json); // <-- 에러 없음

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

  alert( user.name );
} catch(e) {
  alert( "JSON Error: " + e.message ); // JSON Error: 불완전한 데이터: 이름 없음
}

에러 다시 던지기

let json = '{ "age": 30 }'; // 불완전한 데이터 , 아래에서 name을 호출하는데 , name key가 없음.
try {

  let user = JSON.parse(json);

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

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

  alert( user.name );

} catch(e) {
  //SyntaxError 만 처리할것임
  if (e.name == "SyntaxError") {
    alert( "JSON Error: " + e.message ); // name이 없었으니 여기가 실행됨.
  } else {
    throw e; // 에러 다시 던지기 (*), 밖에서 다시 잡아서 처리한다, 그렇지 않으면 종료됨.
  }
}

try..catch..finally

전역 catch

  1. node test.js
    
    const fs = require('fs')

process.on('uncaughtException', (err, origin) => { fs.writeSync( process.stderr.fd, Caught exception: ${err}\n + Exception origin: ${origin} ); });

setTimeout(() => { console.log('This will still run.'); }, 500);

// Intentionally cause an exception, but don't catch it. nonexistentFunc(); console.log('This will not run.');

2. output
> Caught exception: ReferenceError: nonexistentFunc is not defined
> Exception origin: undefinedThis will still run.

3. conclusion
- uncaughtException Listener 등록해서, 프로세스 종료를 하지 않을 수 있었다.
- 등록하지 않았을때, output

nonexistentFunc(); ^

ReferenceError: nonexistentFunc is not defined at Object. (/Users/kgneng2/script/test.js:7:1) at Module._compile (module.js:577:32) at Object.Module._extensions..js (module.js:586:10) at Module.load (module.js:494:32) at tryModuleLoad (module.js:453:12) at Function.Module._load (module.js:445:3) at Module.runMain (module.js:611:10) at run (bootstrap_node.js:394:7) at startup (bootstrap_node.js:160:9) at bootstrap_node.js:507:3


- 브라우저에서는 [window.onerror](https://developer.mozilla.org/ko/docs/Web/API/GlobalEventHandlers/onerror)를 이용

```javascript
<script>
  window.onerror = function(message, url, line, col, error) {
    alert(`${message}\n At ${line}:${col} of ${url}`);
  };

  function readData() {
    badFunc(); // 에러가 발생한 장소
  }

  readData();
</script>

에러메시지 상용 서비스