UniRxUniRxで例外を取り扱う方法をまとめました。UniRxによる例外処理の必要性Subscribeの引数のonErrorで処理するCatchオペレータで例外を補足するCatch時に後続処理が必要ない場合にはCatchIgnoreを使うエラーが起きた時に購読しなおすRetryオペレータ特定の例外のみRetryするにはOnErrorRetryを使う例外発生時に処理はするけど補足はしないDoOnError関連Unity2018.4.0UniRxによる例外処理の必要性まず、下記のように例外を発生させるだけのストリームを作ってみます。}}これを再生してみます。Unityで例外が発生するとConsoleにエラーが出ますが、これを再生してもエラーが出ないことがわかります。これはUniRxどうこうではなく、単純にメインスレッド以外で例外が発生しているからです。試しに上記のコードを下記のようにメインスレッド内で例外が発生するように書き換えてみます。}}この状態で再生をするとConsoleにエラーが表示されることがわかります。このように、UniRxは簡単にマルチスレッドの処理を書ける分、エラーハンドリングはしっかりと行う必要があります(UniRxに限らずしっかりやらないとですが)。そこで、この記事ではUniRxで例外を取り扱う方法をまとめます。Subscribeの引数のonErrorで処理する一番基本的な方法はSubscribeの引数のonErrorに例外発生時の処理を書くことです。}}onErrorはストリーム内で例外が発生した時に例外のインスタンスと共に呼ばれます。Catchオペレータで例外を補足するSubscribe()よりも前に例外処理を書きたい場合にはCatch()を使います。}}ここで、Catch()オペレータの戻り値はIObservableになっています。例外を補足したらその例外を処理して、代わりのObservableを渡すことができます。}}これにより例えば例外補足時にダイアログを出して、そのあとの処理を行うObservableを後続に渡すといったことができます。Catch()オペレータには指定した型の例外のみを補足するという便利な機能があります。}}Catch時に後続処理が必要ない場合にはCatchIgnoreを使う前節のように、CatchオペレータではIObservableを返すことで後続処理を行うストリームを定義できました。このような後続処理が必要ない場合にはCatchオペレータの戻り値にEmptyなストリームを渡します。}}ただこれは若干冗長です。CatchIgnoreオペレータを使うと上記と同等の処理が以下のように書けます。}}エラーが起きた時に購読しなおすRetryオペレータRetry()オペレータを使うと、エラーが起こった時にストリームを再購読してくれます。}}引数にはリトライ数を渡せます。特定の例外のみRetryするにはOnErrorRetryを使う前節のRetry()はどんな例外が発生しても動作してしまいます。「この例外が発生したときのみリトライする」という処理を実装したい場合にはOnErrorRetry()を使います。}}例外発生時に処理はするけど補足はしないDoOnErrorこれまで紹介したオペレータは例外を補足するため、補足後にはOnErrorが発生しなくなります。例外発生時に何かしらの処理を行いたいけど補足する必要がない場合にはDoOnError()オペレータを使います。}}余談ですが、関連するオペレータにDoOnTerminate()やFinish()があります。これらもOnError時に処理を行えるオペレータになります。詳細は以下の記事にまとめていますので、必要に応じて参照してください。»プロフィールUnityエンジニア。グラフィックスへの興味が強めです。インストールから基本的な使い方・注意点まとめ【Unity】【エディタ拡張】テクスチャを指定したUV座標で切り取って保存する【Unity】指定したアセットのAssetBundle名を取得する【Unity】【シェーダ】スクリプトからVP行列を渡してシェーダで座標変換に使う【Unity】【シェーダ】FloatやVectorをリニアライズ対象にするGammaアトリビュート月別アーカイブはてなブログをはじめよう!halya_11さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。