チェンジセット 1974
- コミット日時:
- 2008/12/08 19:15:56 (3 年前)
- ファイル:
凡例:
- 変更無し
- 追加
- 削除
- 更新
- コピー
- 移動
as3/Thread/trunk/src/org/libspark/thread/Thread.as
r1973 r1974 251 251 { 252 252 trace((t ? t.toString() + ' ' : '') + (e is Error ? (e as Error).getStackTrace() : e.toString())); 253 254 if (currentThread != null) {255 next(null);256 }257 253 } 258 254 … … 267 263 * @param klass どの型の例外が発生した場合に関数を実行するかを示すクラス 268 264 * @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 271 268 { 272 269 if (func != null) { 273 addDefaultErrorHandler(klass, func );270 addDefaultErrorHandler(klass, func, autoTermination); 274 271 } 275 272 else { … … 295 292 * @param handler エラーハンドラ 296 293 * @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); 302 300 } 303 301 … … 403 401 * @param func 例外が発生した際に実行される実行関数 404 402 * @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 407 406 { 408 407 if (func != null) { 409 getCurrentThread().addErrorHandler(klass, func, reset );408 getCurrentThread().addErrorHandler(klass, func, reset, autoTermination); 410 409 } 411 410 else { … … 853 852 * @param handler エラーハンドラ 854 853 * @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); 860 860 } 861 861 … … 909 909 private function getErrorHandler(error:Object):ErrorHandler 910 910 { 911 // まずスレッド自身に登録されているエラーハンドラを検索 911 912 var handler:ErrorHandler = getErrorHandlerFrom(error, _errorHandlers); 913 // 見つからなければ、デフォルトのエラーハンドラを検索 912 914 if (handler == null) { 913 915 handler = getErrorHandlerFrom(error, _defaultErrorHandlers); … … 1209 1211 // エラーハンドラである場合は例外と例外の発生元のスレッドを引数として渡す 1210 1212 runHandler.apply(this, [error, errorThread]); 1213 // 自動終了が求められていれば next(null) を呼び出す 1214 if (errorHandler.autoTermination) { 1215 next(null); 1216 } 1211 1217 } 1212 1218 else if (_event != null) { … … 1395 1401 class ErrorHandler 1396 1402 { 1397 public function ErrorHandler(handler:Function, reset:Boolean )1403 public function ErrorHandler(handler:Function, reset:Boolean, autoTermination:Boolean) 1398 1404 { 1399 1405 this.handler = handler; 1400 1406 this.reset = reset; 1407 this.autoTermination = autoTermination; 1401 1408 } 1402 1409 1403 1410 public var handler:Function; 1404 1411 public var reset:Boolean; 1412 public var autoTermination:Boolean; 1405 1413 } 1406 1414 as3/Thread/trunk/tests/org/libspark/thread/ExceptionTest.as
r1973 r1974 322 322 t.start(); 323 323 } 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 } 324 341 } 325 342 } … … 927 944 } 928 945 } 946 947 class 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 }

