[코드팩토리] try...catch
기본 개념
error를 잡는데 사용한다.
사용 하는 키워드는 아래와 같다.
- throw : 에러를 발생 시킨다 ☞ 에러를 '던진다'
- catch : 에러를 명시적으로 인지한다 ☞ 에러를 '잡는다'
throw로 에러를 던지면 그 다음 코드는 실행되지 않는다.
function runner(){
console.log('hello');
throw new Error('큰 문제가 생겼습니다!');
console.log('world'); // 위에서 throw로 에러를 던졌기 때문에 이 코드는 실행되지 않음.
}
runner();
throw로 던진 에러를 catch로 잡을 수 있다.
function runner() {
try {
console.log('hello');
throw new Error('큰 문제가 생겼습니다!'); // 여기서 에러를 throw로 던졌다.
console.log('world'); // 위에서 throw로 에러를 던졌기 때문에 이 코드는 실행되지 않음.
}catch(e){ // throw에서 에러를 던지면 바로 catch로 넘어간다. catch의 파라미터로 e로 넣어 에러내용을 잡았고, console.log에 e 내용을 출력하도록 했다.
console.log(e);
}
}
runner();
여기에 finally 블록을 더 넣을 수도 있다. 순서는 try{} catch() {} finally {} 순이다.
finally는 try에서 에러가 났든 안 났든 무조건 실행되는 함수로, 가장 마지막에 실행되는 블록이다.
function runner() {
try {
console.log('hello');
throw new Error('큰 문제가 생겼습니다!'); // 여기서 에러를 throw로 던졌다.
console.log('world'); // 위에서 throw로 에러를 던졌기 때문에 이 코드는 실행되지 않음.
}catch(e){ // throw에서 에러를 던지면 바로 catch로 넘어간다. catch의 파라미터로 e로 넣어 에러내용을 잡았고, console.log에 e 내용을 출력하도록 했다.
console.log(e);
}finally{ // world 출력을 건너뛰고 catch가 실행된 다음 마지막으로 콘솔에 로그를 띄우게 된다.
console.log('완료되었습니다.');
}
}
runner();
이해를 돕기 위해 다른 예시를 하나 더 들겠다.
function greet(name) {
try {
if (typeof name !== 'string') {
throw '이름은 문자열이어야 합니다.';
}
console.log('안녕하세요, ' + name + '님!');
} catch (error) {
console.error('인사를 할 수 없습니다:', error);
} finally {
console.log('인사가 완료되었습니다.');
}
}
// greet 함수 호출
greet('장원영'); // 올바른 문자열을 전달하여 함수 실행
greet(123); // 잘못된 데이터 타입을 전달하여 예외 발생
코드해석
greet라는 함수를 지정하고 파라미터로 name을 받는다.
이 함수의 기능은 try...catch 구문이 사용되었으므로, try에서 에러가 발생하면 catch로 바로 넘어가도록 하게 되어있다.
try 내부를 보니 if문이 쓰였다. 만약 greeting의 인자인 name의 데이터 타입이 string이 아니면(!==) 중괄호 안의 코드인
throw 에러를 던진다. '이름이 문자열이어야 합니다.'라는 에러와 함께.
만약 typeof name이 string이 아닌 게 아니면(즉 name의 데이터 타입이 스트링이 맞으면) 콘솔에 '안녕하세요, name님!'을 출력해라.
만약 try 내에서 에러가 발생하면 throw에서 던지고 그 바로 다음 코드인 안녕하세요 name님은 실행되지 않으며
바로 catch로 에러를 잡게 된다.catch의 파라미터로 error를 잡도록 명명했고, catch로 에러를 잡고 나면 '인사를 할 수 없습니다.'라는 에러 문구를 포함해서 출력하도록 했다.
그리고 try내에서 에러가 발생했든 안 했든 마지막 finally로 넘어가 '인사가 완료되었습니다'라는 문구를 콘솔에 띄우도록 한다.
greet의 아규먼트로 '장원영'을 넣었더니 if typeof name !== 'string'이 false다. (name의 데이터타입이 스트링이 아니다 ☞ 스트링이 맞으니 다음 중괄호인 throw 문자열이어야 합니다의 코드를 생략하고 else값인 '안녕하세요 name님' 으로 넘어가게 된다.
그리고 에러가 났든 안 났든 finally는 실행되어야 하기 때문에 인사가 완료되었습니다가 출력되며 코드가 마무리 된다.
추가학습. 비교연산자 === (같음), !== (같지 않음)
추가학습. if (조건) {true일 때 실행할 코드} else {거짓일 때 실행할 코드}
if (조건) {
// 조건이 참일 때 실행될 코드
} else {
// 조건이 거짓일 때 실행될 코드 (선택적)
}
그러나 위에서는 아래와 같이 작성됐다.
if (조건) {true일 때 실행할 코드} false일 때 실행할 코드
즉 else와 else 다음의 {} 중괄호는 생략 가능하다.
출처 : https://youtu.be/ZOVG7_41kJE?si=ujb7usAQFvJMxpp7
'Programing > JavaScript' 카테고리의 다른 글
[모던JS] 001. [소개] 자바스크립트란? (1) | 2024.03.23 |
---|---|
[코드팩토리] 클래스 기본기 (Class basics) (1) | 2024.03.05 |
[코드팩토리] 값 레퍼런스 복사 (Copy by value and reference) (1) | 2024.03.05 |
[코드팩토리] 객체 기본 (Object basics) (0) | 2024.03.05 |
[코드팩토리] 어레이 함수 (Array Functions) (4) | 2024.03.05 |
댓글