18207


お世話になります  
onsen-
ui+angularJSを使用してアプリケーションを作成したところ、オーバーライドしたAngularJSの$exceptionHandlerが実行されたり、されなかったりするという現象が発生しました。  
いろいろ調べたのですが、法則性が見つからず原因が特定できません。

代表的なものとして、通常の例外は$exceptionHandlerがキャッチしてくれるのですが、  
ons.ready内で発生した例外は$exceptionHandlerでキャッチしてくれません。

[code]

    // オーバーライドした$exceptionHandler
    (function () {
        "use strict";    
        angular.module('App')
            .factory('$exceptionHandler', ['$window', function ($window) {
                return function (exception) {
                    $window.alert(exception);
                };
            }]);
    }());
    
[/code]

[code]

    // オーバーライドした$exceptionHandlerがキャッチしてくれるケース
    angular.module('App').controller(
        'ExceptionController', ['$scope', function ($scope) {
            throw new Error("ErrorTest");
    }]);
    
[/code]

[code]

    // オーバーライドした$exceptionHandlerがキャッチしてくれないケース
    angular.module('App').controller(
        'ExceptionController', ['$scope', function ($scope) {
            ons.ready(function () {
                throw new Error("ErrorTest");
        });
    }]);
    
[/code]

このほかにも、ons-navigatorタグで指定したng-
controllerのコントローラー内で発生した例外はオーバーライドした$exceptionHandlerがキャッチしてくれますが、ons-
pageタグで指定したng-controllerのコントローラー内で発生した例外はキャッチしてくれないなどのケースがあります。

原因をご存知の方がおられたらご教授のほどよろしくお願いします。


CC BY-SA 3.0
2015-10-22T03:12:00.893
17924
2015-10-29T12:58:26.933
12895
question
monaca onsen-ui angularjs cordova
Onsen-UI上でオーバーライドした$exceptionHandlerが実行されない


Angularのソースにコメントがありました。

> Note, that code executed in event-listeners (even those registered  
>  using jqLite's `on`/`bind` methods) does not delegate exceptions to  
>  the {@link ng.$exceptionHandler $exceptionHandler} (unless executed  
>  during a digest).
>
> If you wish, you can manually delegate exceptions, e.g.  
>  `try { ... } catch(e) { $exceptionHandler(e); }`

イベントリスナ内で発生した例外は、digestループ中でない限り$exceptionHandlerには渡らないとあります。`ons.ready()`の引数に指定した関数は`$ons-
ready`イベントのハンドラ内で実行されるため、上記のケースにあたります。  
ちなみに、`$scope.$apply()`で囲むとちゃんとアラートで表示されました。

[code]

    ons.ready(function(){
      $scope.$apply(function() {
        throw 'error';
      });
    });
    
[/code]

`<ons-page>`タグで指定したコントローラ内の例外をキャッチしないという件は、こちらでは再現しませんでした。


CC BY-SA 3.0
2015-10-29T12:58:26.933
18207
2015-10-29T12:58:26.933
8532
17924
answer