チェンジセット 1974

差分発生行の前後
無視リスト:
コミット日時:
2008/12/08 19:15:56 (3 年前)
コミッタ:
yossy
ログメッセージ:

Thread: エラーハンドラの実行後に、next(null) を自動で呼び出す設定を追加

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • as3/Thread/trunk/src/org/libspark/thread/Thread.as

    r1973 r1974  
    251251                { 
    252252                        trace((t ? t.toString() + ' ' : '') + (e is Error ? (e as Error).getStackTrace() : e.toString())); 
    253                          
    254                         if (currentThread != null) { 
    255                                 next(null); 
    256                         } 
    257253                } 
    258254                 
     
    267263                 * @param       klass   どの型の例外が発生した場合に関数を実行するかを示すクラス 
    268264                 * @param       func    例外が発生した際に実行される実行関数 
    269                  */ 
    270                 public static function registerDefaultErrorHandler(klass:Class, func:Function):void 
     265                 * @param       autoTermination 実行関数の実行後、Thread#next(null) を自動的に呼び出すのであれば true, そうでなければ false 
     266                 */ 
     267                public static function registerDefaultErrorHandler(klass:Class, func:Function, autoTermination:Boolean = false):void 
    271268                { 
    272269                        if (func != null) { 
    273                                 addDefaultErrorHandler(klass, func); 
     270                                addDefaultErrorHandler(klass, func, autoTermination); 
    274271                        } 
    275272                        else { 
     
    295292                 * @param       handler エラーハンドラ 
    296293                 * @param       reset   リセットするか 
    297                  * @private 
    298                  */ 
    299                 private static function addDefaultErrorHandler(klass:Class, handler:Function):void 
    300                 { 
    301                         getDefaultErrorHandlers()[getQualifiedClassName(klass)] = new ErrorHandler(handler, false); 
     294                 * @param       autoTermination 自動で next(null) を呼び出すか 
     295                 * @private 
     296                 */ 
     297                private static function addDefaultErrorHandler(klass:Class, handler:Function, autoTermination:Boolean):void 
     298                { 
     299                        getDefaultErrorHandlers()[getQualifiedClassName(klass)] = new ErrorHandler(handler, false, autoTermination); 
    302300                } 
    303301                 
     
    403401                 * @param       func    例外が発生した際に実行される実行関数 
    404402                 * @param       reset   次の実行のタイミングでこの設定を削除する場合には true、そうでなければ false 
    405                  */ 
    406                 public static function error(klass:Class, func:Function, reset:Boolean = true):void 
     403                 * @param       autoTermination 実行関数の実行後、Thread#next(null) を自動的に呼び出すのであれば true, そうでなければ false 
     404                 */ 
     405                public static function error(klass:Class, func:Function, reset:Boolean = true, autoTermination:Boolean = false):void 
    407406                { 
    408407                        if (func != null) { 
    409                                 getCurrentThread().addErrorHandler(klass, func, reset); 
     408                                getCurrentThread().addErrorHandler(klass, func, reset, autoTermination); 
    410409                        } 
    411410                        else { 
     
    853852                 * @param       handler エラーハンドラ 
    854853                 * @param       reset   リセットするか 
    855                  * @private 
    856                  */ 
    857                 private function addErrorHandler(klass:Class, handler:Function, reset:Boolean):void 
    858                 { 
    859                         getErrorHandlers()[getQualifiedClassName(klass)] = new ErrorHandler(handler, reset); 
     854                 * @param       autoTermination 自動で next(null) を呼び出すか 
     855                 * @private 
     856                 */ 
     857                private function addErrorHandler(klass:Class, handler:Function, reset:Boolean, autoTermination:Boolean):void 
     858                { 
     859                        getErrorHandlers()[getQualifiedClassName(klass)] = new ErrorHandler(handler, reset, autoTermination); 
    860860                } 
    861861                 
     
    909909                private function getErrorHandler(error:Object):ErrorHandler 
    910910                { 
     911                        // まずスレッド自身に登録されているエラーハンドラを検索 
    911912                        var handler:ErrorHandler = getErrorHandlerFrom(error, _errorHandlers); 
     913                        // 見つからなければ、デフォルトのエラーハンドラを検索 
    912914                        if (handler == null) { 
    913915                                handler = getErrorHandlerFrom(error, _defaultErrorHandlers); 
     
    12091211                                                // エラーハンドラである場合は例外と例外の発生元のスレッドを引数として渡す 
    12101212                                                runHandler.apply(this, [error, errorThread]); 
     1213                                                // 自動終了が求められていれば next(null) を呼び出す 
     1214                                                if (errorHandler.autoTermination) { 
     1215                                                        next(null); 
     1216                                                } 
    12111217                                        } 
    12121218                                        else if (_event != null) { 
     
    13951401class ErrorHandler 
    13961402{ 
    1397         public function ErrorHandler(handler:Function, reset:Boolean
     1403        public function ErrorHandler(handler:Function, reset:Boolean, autoTermination:Boolean
    13981404        { 
    13991405                this.handler = handler; 
    14001406                this.reset = reset; 
     1407                this.autoTermination = autoTermination; 
    14011408        } 
    14021409         
    14031410        public var handler:Function; 
    14041411        public var reset:Boolean; 
     1412        public var autoTermination:Boolean; 
    14051413} 
    14061414 
  • as3/Thread/trunk/tests/org/libspark/thread/ExceptionTest.as

    r1973 r1974  
    322322                        t.start(); 
    323323                } 
     324                 
     325                /** 
     326                 * autoTermination = true の場合、エラーハンドラの実行後に next(null) が自動で呼び出されるか。 
     327                 */ 
     328                test function autoTermination():void 
     329                { 
     330                        Static.log = ''; 
     331                         
     332                        var t:TesterThread = new TesterThread(new AutoTerminationTestThread()); 
     333                         
     334                        t.addEventListener(Event.COMPLETE, async(function(e:Event):void 
     335                        { 
     336                                assertEquals('run errorHandler finalize ', Static.log); 
     337                        }, 1000)); 
     338                         
     339                        t.start(); 
     340                } 
    324341        } 
    325342} 
     
    927944        } 
    928945} 
     946 
     947class AutoTerminationTestThread extends Thread 
     948{ 
     949        override protected function run():void 
     950        { 
     951                Static.log += 'run '; 
     952                 
     953                next(run2); 
     954                error(Error, errorHandler, true, true); 
     955                 
     956                throw new Error(); 
     957        } 
     958         
     959        private function run2():void 
     960        { 
     961                Static.log += 'run2 '; 
     962        } 
     963         
     964        private function errorHandler(e:Error, t:Thread):void 
     965        { 
     966                Static.log += 'errorHandler '; 
     967                 
     968                next(run2); 
     969        } 
     970         
     971        override protected function finalize():void 
     972        { 
     973                Static.log += 'finalize '; 
     974        } 
     975}