AnnulusGames / LitMotion

Lightning-fast and Zero Allocation Tween Library for Unity.

Home Page:https://annulusgames.github.io/LitMotion/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

When a callback raises an exception, should it be treated as complete?

Akeit0 opened this issue · comments

現在、Callbackが例外を吐くとき、Logを出してそのままですが、
Complete扱いにした方がいいと思います。もしくはOptionで選べるようにするとか。
MotionCallbackDataのCancellationTokenはそのためにもあるとは思いますが、どうでしょうか?
またOperationCanceledExceptionを特別扱いして、例外を無視することも考えられます。(これもOption?)
UnityObjectにBindする系もnullを例外扱いさせるとよいと思います。

現在、Callbackが例外を吐くとき、Logを出してそのままですが、
Complete扱いにした方がいいと思います。

内容の意図をいまいち理解できていないのですが、これは具体的にどのような挙動を想定していますか?

OperationCanceledExceptionの無視に関してはコールバック内部でtry-catchを記述し、例外をスルーする処理を書けば可能だであるため、わざわざオプションを追加する必要はないと思います。(CancellationTokenはUniTaskとのスムーズな統合のために組み込まれています。)

一度例外を出した後、毎フレーム例外を出し続ける可能性があるため、それを避けたい場合もあるかなと思いコメントしました。

Unityのコンポーネントに対するBindの拡張はnullチェックを入れてエラーが起きないような仕様になっていますが、こちらに対しては警告のログを表示することを検討しています。例外を投げる方がより厳密なハンドリングが可能ですが、トゥイーンライブラリの多くはオブジェクトが破棄された後もそのまま動作する仕様になっているため、それらに倣った方が良いかと思われます。

Tweenライブラリとしての一般的な仕様に倣うということであればcloseします

一度例外を出した後、毎フレーム例外を出し続ける可能性があるため

なるほど、理解しました。確かにそのような状況はあり得るためエラー時にキャンセルするオプションを追加しても良いかもしれません。
考えられるAPIは以下のようなものですが、いかがでしょうか。

LMotion.Create(0f, 10f, 2f)
    .WithCancelOnError()
    .Bind(...);

UniTask側にcancelを知らせた方が良いかもしれないですね
ちょっとユーザーにはわかりづらいことになるかもしれないですが

いやすみません。単純にOnCopmleteが呼ばれないだけですね

#13 でWithCancelOnErrorを追加しました。
Cancel周りでUniTaskとのとの連携が上手く行われていないために発生する不具合を発見しましたが、これはこのissueとは関係ないので一旦Closeします。

了承したあとで申し訳ないですが、OnCompleteにDispose処理を書いている可能性があるので、enum ErrorBehaviourが適切だと思いました。重要ではないので、ここに書いておきます。