Nuxt.jsの教材で初めて見て「なにこれ?」となったので
throw文
開発者が明示的にエラーを投げる(throw)ことが出来る。
main.js
throw 'エラーです!!'
ただ、直接文字列を投げるのはNGらしい。
(スタックトレースを取得できない為)
Error
オブジェクトを使うのが正解
main.js
throw new Error('エラーです!!');
何も投げないのもNG
main.js
throw;
エラーが発生した時点で処理が止まります
main.js
console.log('実行されます!!');
throw new Error('エラーです!!');
console.log('実行されません!!');
try...catch文
エラー発生時に何らかの処理を続行できる
main.js
try {
<エラーが発生する可能性のある処理>
} catch(<エラー>) {
<エラー時の処理>
} finally {
<後処理(エラーが有っても無くてもする処理)>
}
main.js
try {
console.log('実行されます!!');
throw new Error('エラーです!!');
console.log('実行されません!!');
} catch (e) {
console.log(e);
} finally {
console.log('後処理!!');
}
catch
でエラーが処理されるとそのエラーが無かったことになり、実行が継続される。
catch
、finally
はそれぞれ省略できる、
だが、両方省略はできない。
###finally
を省略する
main.js
try {
console.log('実行されます!!');
throw new Error('エラーです!!');
console.log('実行されません!!');
} catch(e) {
console.log(e);
}
###catch
を省略する
main.js
try {
console.log('実行されます!!');
throw new Error('エラーです!!');
console.log('実行されません!!');
} finally {
console.log('後処理!!');
}
しかし、この場合エラーは処理されていないので、外側のエラーが発生する。
エラー内容が入っているe
も省略できる
main.js
try {
console.log('実行されます!!');
throw new Error('エラーです!!');
console.log('実行されません!!');
} catch {
console.log('こっちがホントのエラーです!!');
} finally {
console.log('後処理!!');
}
###catch
で再度エラーを投げる
main.js
try {
console.log('実行されます!!');
throw new Error('エラーです!!');
console.log('実行されません!!');
} catch(e) {
throw new Error(e);
} finally {
console.log('後処理!!');
}
console.log('実行されません!!');
catch
で再度エラーを投げてもfinally
の処理は実行される。
###ネストもできる
main.js
try {
console.log('実行されます!!');
try {
console.log('実行されます!!');
throw new Error('エラーです!!');
console.log('実行されません!!');
} catch (e) {
console.log('内側' + e);
}
} catch (e) {
console.log('外側' + e);
}
この場合エラーは内側でのみ処理される。
###関数からもエラーを補足できる
main.js
const error = () => {
throw new Error('関数からエラーです!!');
console.log('実行されません!!');
}
try {
console.log('実行されます!!');
error()
console.log('実行されません!!');
} catch (e) {
console.log(e);
} finally {
console.log('後処理!!');
}