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

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

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

RxJSは、Observablesを用いたリアクティブプログラミングのJavaScript向けの実装です。イベント駆動処理も含めた非同期処理を高い可読性を持って容易にコーディングできます。

Q&A

解決済

2回答

971閲覧

RxJSにおいて、onNextの処理中に発生した例外をキャッチするにはどうすれば良いのでしょうか?

momoth

総合スコア15

RxJS

RxJSは、Observablesを用いたリアクティブプログラミングのJavaScript向けの実装です。イベント駆動処理も含めた非同期処理を高い可読性を持って容易にコーディングできます。

0グッド

0クリップ

投稿2018/12/25 06:36

編集2018/12/25 07:42

RxJSについて、おそらく大変初歩的な質問だと思うのですが、ご教授下さい。

ObservableをsubscribeしたときのonNext中の処理において例外が発生したとき、その例外をキャッチするにはどのように書けば良いのでしょうか?
現在は下記のように書いていますが、try/catchでもキャッチできず、catchErrorにもonErrorにも入らないため、subscribeが終了しない状態で固まってしまいます。

TypeScript

1observable.pipe( 2 catchError((error) => { 3 console.log('catchError'); 4 throw error; 5 }) 6).subscribe( 7 // onNext 8 (x) => { 9 // 例外を投げるメソッド 10 try { 11 this.throwMethod(); 12 } catch (e) { 13 throw e; 14 } 15 }, 16 // onError 17 err => { 18 console.log('onError'); 19 throw err; 20 } 21); 22 23// 例外を投げるメソッド 24throwMethod () { 25 observable2. 26 subscribe( 27 // これが例外を投げる場合がある 28 this.getObservable3() 29 .pipe( 30 catchError((err) => { 31 throw(err); 32 } 33 ) 34 .subscribe( 35 (x) => { 36 // 正常時の処理 37 }, 38 err => { 39 throwError(err); 40 } 41 ); 42 ) 43}

どうぞよろしくお願い致します。

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

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

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

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

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

kakajika

2018/12/25 06:55

try/catchでも例外が捕捉できないということは例外の投げ方が間違っているのではないでしょうか?throwMethodの中身も載せていただいたほうがいいと思います。あとcatch節の中で再度例外をthrowしているのは意味のないコードでは…?
guest

回答2

0

ベストアンサー

Rxにおいては、例外の処理はObservableのチェーンによって後続の処理に渡していくのが原則です。以下のように、Observableを関数の戻り値として返し、処理をつなげていくように修正してみてください。

js

1throwMethod = (): Observable<...> => { 2 return observable2.pipe( 3 flatMap(() => this.getObservable3()) 4 ) 5} 6 7observable1.pipe( 8 flatMap(() => throwMethod()) 9).subscribe( 10 (x) => { 11 // 正常時の処理 12 }, 13 err => { 14 // 例外処理 15 } 16);

投稿2018/12/25 08:38

編集2018/12/25 08:41
kakajika

総合スコア3131

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

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

momoth

2018/12/25 09:24

アドバイス頂いたように、後続の処理で例外を受け取る方針で修正したところ、上手くonErrorで受け取ることができました! ありがとうございました。
guest

0

js

1Rx.Observable.from([10, 20, 30]) 2 .subscribe( 3 x => { 4 console.log(x); 5 try { 6 throw new Error() 7 } 8 catch (e) { console.log(e) } // ここでちゃんとキャッチする 9 });

投稿2018/12/25 07:04

ozwk

総合スコア13521

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問