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

Closed
fukudayasuo opened this Issue May 28, 2014 · 4 comments

Comments

Projects
None yet
2 participants
@fukudayasuo

__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

fukudayasuo
#329 __unbind,__disposeで例外が発生した場合に、処理が継続するように修正しました。
__unbind,__disposeで起きた例外を拾って、setTimeoutを使って非同期で投げるようにしました。
テストケースを追加しました。
__postInitで例外を投げるケースを追加しました。
既存のコントローラバインド時に実行されるライフサイクルイベントで例外を投げるケースについて、disposeされたことを確認するようにしました。
setupで、不要なDOM生成をしないようにしました。
@fukudayasuo

This comment has been minimized.

Show comment
Hide comment
@fukudayasuo

fukudayasuo 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で発生した例外は拾えません
}

本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

This comment has been minimized.

Show comment
Hide comment
@simdy

simdy Jun 9, 2014

Member

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

Member

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

fukudayasuo
#329 __unbind,__disposeで例外が起きた時はそれを拾い、処理を継続するようにしました。
例外はtry-catchまたはlifecycleerrorイベントで取得できます。
(コントローラ初期化時のエラーでdisposeする時と同様)
@fukudayasuo

This comment has been minimized.

Show comment
Hide comment
@fukudayasuo

fukudayasuo Jun 26, 2014

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

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

@simdy

This comment has been minimized.

Show comment
Hide comment
@simdy

simdy Jun 27, 2014

Member

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

Member

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