質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

7514閲覧

fetchのエラー処理について

退会済みユーザー

退会済みユーザー

総合スコア0

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2019/06/15 12:09

編集2019/06/15 12:36

javascript

1fetch('flowers.jpg').then(function(response) { 2 if(response.ok) { 3 return response.blob(); 4 } 5 throw new Error('Network response was not ok.'); 6}).then(function(myBlob) { 7 var objectURL = URL.createObjectURL(myBlob); 8 myImage.src = objectURL; 9}).catch(function(error) { 10 console.log('There has been a problem with your fetch operation: ', error.message); 11});

上記ではresponse.okで成功を判定し、さらにその下でエラー時の処理を記述しています
しかし、最下部でcatch(function(error){...}という処理も記述されており、これらのエラー処理の違いがわかりません
エラー時の処理は全く同様に見受けられたのですが、何か違いがあるのでしょうか?

たとえば下記のような記述でも処理は同様でしょうか?

javascript

1fetch('flowers.jpg').then(function(response) { 2 return response.blob(); 3}).then(function(myBlob) { 4 var objectURL = URL.createObjectURL(myBlob); 5 myImage.src = objectURL; 6}).catch(function(error) { 7 console.log('There has been a problem with your fetch operation: Network response was not ok.; 8});

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

responseをチェックして、okじゃなかった場合に生成している例外を見ることで「レスポンスがOKじゃない」事がわかるようにするためのチェックです。
この場合は、少なくとも(アドレス間違えるなどとんでもないミスをしてない限り)相手サーバーには通信ができていることはわかります。

そこまで至る前にエラーになってた(ネットワークに繋がってないとか切れたとか宛先不明とか)の場合は、別の例外がcatchに流れます。

投稿2019/06/15 13:18

編集2019/06/15 13:20
gentaro

総合スコア8949

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/15 19:32 編集

ありがとうございます つまり、catchのエラー時はresponse.okにも必ずならないので、包括的なエラーを判定したい場合はresponse.okだけを見ても問題ないですね
gentaro

2019/06/15 23:06

逆じゃないですか?renposne.okを見なくても、response.blob()の実行でデータが取得できない場合にちゃんと例外が発生してくれれば、catchには流れるので。 それが良いのか悪いのかは、プログラムの仕様次第なので第三者にはどっちが良いとか言えませんが。 一般論として、例外を含むエラー処理をちゃんとしていない、つまり自動でリトライしたり、ネットワークの接続を確認させて再度処理を行うように促すなど、あらかじめ想定できるエラーの種類別の対策を行っていないプログラムは「品質が良くない」とは言われると思いますが。(業務レベルの話です)
退会済みユーザー

退会済みユーザー

2019/06/16 03:22

仮に404であってもfetchメソッドは例外をスローしないとの事なので、renposne.okが網羅的ではないでしょうか?
gentaro

2019/06/16 03:51

404もそうですけど「レスポンスが帰ってきて中身が望ましくない結果」だった場合にどうしたいのか?という問題です。 最初のコードでは、その場合に一応わかる程度のメッセージ(Network response was not ok.)を含んだ例外を意図的に投げることで、一応ケアされてますよね。(コンソール出力を見れば少なくともokじゃなかった事ぐらいはわかる) response.okじゃない場合にresponse.blob()を実行した結果が自分の思い通りになっている(例外が発生するなど)のであれば必要ないでしょうけど、多分そうならないでしょうね。(空のデータが返されると思います。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問