0
1

More than 1 year has passed since last update.

本記事は一人アドベントカレンダー企画の一つです。
30代未経験エンジニアが25日後にJavaScriptをマスターするカレンダー

JAVASCRIPT.INFOを元にJavaScriptを勉強していき、そこで学んだ知識をアウトプットしていきます。
25日でJAVASCRIPT.INFOをやりきり、未経験エンジニアがJavaScriptをマスターする過程を投稿していきます。

10.1 エラーハンドリング, "try..catch"

知らない単語

  • コントロールフローとは
    • 受信側の処理が追いつかずにデータを取りこぼしたりするのを防ぐため、通信状況に応じて送信停止や速度制限などの調整を行う機能

学んだこと

  • “try…catch” 構文

普通はエラーが発生するとスクリプトは即時に停止し、それをコンソールに出力するが、
「try..catch」を使用する事でエラーがあった時にcatchに入り、処理が停止しない
書き方は

try {

  // code...

} catch (err) {

  // error handling

}

となっていて、(err)がある事でエラーになった場合、エラーの中身を見る事ができる

  • try…catchの利用

JavaScriptで JSON.parse(str) を使う場合、

let json = "{ bad json }";

try {

  let user = JSON.parse(json); // <-- エラーが起きたとき...
  alert( user.name ); // 動作しない

} catch (e) {
  // ...実行はここに飛ぶ
  alert( "Our apologies, the data has errors, we'll try to request it one more time." );
  alert( e.name );
  alert( e.message );
}

json が不正な形式の場合、JSON.parse はエラーになるのでスクリプトは停止する
この書き方では、もしデータが間違っている場合、間違っている事自体がわからないので、
どのようなエラーかを知る為に try..catch を使った方がよい
自分で怪しいと思った箇所にはtry..catch を入れてもいいかもしれない

  • Throw演算子

Throw演算子は自分の出したいエラーを出せる
書き方は

throw <error object>
let error = new Error(message);

であり、通常のブラウザが出してくるエラーより自分で設定したエラーの方が読みやすい

  • 再スロー

catchに入ってもエラーを出すことができる

  • try…catch…finally

finallyはtryの後でもcatchの後でも入る
最後に処理を加えたい時に使用する

感想

try…catchは自分でエラーが出るかチェックでき、Throw演算子は自分なりのエラー表示ができるので、自由度が高く便利である。

10.2 カスタムエラー, Error の拡張

知らない単語

  • 無し

学んだこと

カスタムエラー

Throw演算子は自分でエラーメッセージが作れるが、カスタムエラーはさらに細かいものである
コードの書き方は

// JavaScript自体で定義された組み込みのErrorクラスの「擬似コード」
class Error {
  constructor(message) {
    this.message = message;
    this.name = "Error"; // (組み込みのエラークラスごとに異なる名前)
    this.stack = <nested calls>; // 非標準だが、ほとんどの環境はサポートしている
  }
}

というようになり、class Error が決まりになっている

  • さらなる継承

簡単に言えば、「class ValidationError extends Error」で1番細かいエラーを作る事ができる

class ValidationError extends Error {
  constructor(message) {
    super(message);
    this.name = "ValidationError";
  }
}
  • 例外のラッピング

下記のコードでは2種類のエラーがある

try {
  ...
  readUser()  // 潜在的なエラーの原因
  ...
} catch (err) {
  if (err instanceof ValidationError) {
    // バリデーションエラーの処理
  } else if (err instanceof SyntaxError) {
    // シンタックスエラーの処理
  } else {
    throw err; // 未知のエラー、再スロー
  }
}

要は、バリデーションエラーとシンタックスエラーの時で違う処理を書く事ができる

感想

エラーメッセージはかなり自由に変更する事がよくわかる。実務でもよく使用する事になるのかはわからないが、わすれないようにする。

最後に

元ページに書いてある事をかなり簡単に要約しているが、解釈が間違っている可能性もあるので、自分で詳しく調べたり、周りのエンジニアに聞いて正しい知識を身につけたい。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1