Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

__unbind,__disposeで例外が投げられたときに、コントローラのdispose処理が中断されてしまう #329

Closed
fukudayasuo opened this issue May 28, 2014 · 4 comments
Assignees
Labels
Milestone

Comments

@fukudayasuo
Copy link

@fukudayasuo fukudayasuo commented May 28, 2014

__dispose(または__unbind)でコントローラが例外を投げるとき、そのコントローラをdispose(またはunbind)すると、コントローラのdispose(またはunbind)処理が完了しない。

h5.core.controller('body', {
  __name:'A',
  __unbind:function(){
      throw new Error();
  }
});

上記のようなコントローラをdisposeすると、__unbindでエラーが発生して処理が中断し、イベントハンドラのアンバインドは行われず、disposeの処理も実行されない。

__unbind,__disposeで例外が発生しても、コントローラのunbind処理、dispose処理が行われるようにする。

fukudayasuo pushed a commit to hifive-labs/hifivemain that referenced this issue May 30, 2014
__unbind,__disposeで起きた例外を拾って、setTimeoutを使って非同期で投げるようにしました。
テストケースを追加しました。
__postInitで例外を投げるケースを追加しました。
既存のコントローラバインド時に実行されるライフサイクルイベントで例外を投げるケースについて、disposeされたことを確認するようにしました。
setupで、不要なDOM生成をしないようにしました。
@fukudayasuo
Copy link
Author

@fukudayasuo fukudayasuo commented May 30, 2014

本issueの対応に伴い、以下のように動作するようになりました。

  • __unbind,__disposeで例外が発生した時、unbind処理、dispose処理は継続するようになりました。
  • __unbind,__disposeで投げられた例外は非同期で投げられるようになりました。

(try-catchでは拾えません。window.onerrorで拾うことができます。)

window.onerror = function(e){
   // __unbindで例外が発生した場合、window.onerrorで拾えます
};
try{
    controller.unbind();
} catch(e){
   // ここでは__unbindで発生した例外は拾えません
}
@simdy
Copy link
Member

@simdy simdy commented Jun 9, 2014

異常時の動作を全体的に明確化してから対応するため、ver.1.1.11には含めず、後のバージョンで対応することとします。

fukudayasuo pushed a commit to hifive-labs/hifivemain that referenced this issue Jun 9, 2014
fukudayasuo pushed a commit to hifive-labs/hifivemain that referenced this issue Jun 24, 2014
例外はtry-catchまたはlifecycleerrorイベントで取得できます。
(コントローラ初期化時のエラーでdisposeする時と同様)
@fukudayasuo
Copy link
Author

@fukudayasuo fukudayasuo commented Jun 26, 2014

#367 で対応しました。
__unbind,__disposeで例外が発生した場合でもdispose処理は中断しないようになりました。また、発生した例外はdispose処理完了後に投げられます。
__unbind,__disposeで例外が投げられた場合、__initや__readyで例外が投げられた場合と同じくコントローラは異常終了扱いとなります。lifecycleerrorイベントが上がり、コントローラインスタンスのnullifyは行われません。

@simdy
Copy link
Member

@simdy simdy commented Jun 27, 2014

元々、__unbind, __disposeでは例外を送出しないこと、をルールとしています。
しかし、外部ライブラリ利用時にそのライブラリが例外を出してしまう場合、
あるいは開発中で例外が予期せずでてしまう場合などがあることを踏まえ、
「できるだけきれいにクリーンアップ処理を行える」ようにしました。

@simdy simdy closed this Jun 27, 2014
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
2 participants
You can’t perform that action at this time.