@@ -3,7 +3,7 @@ use core::any::Any;
3
3
4
4
use crate :: {
5
5
component:: { ComponentHook , ComponentId , HookContext , Mutable , StorageType } ,
6
- error:: ErrorContext ,
6
+ error:: { ErrorContext , ErrorHandler } ,
7
7
observer:: { ObserverDescriptor , ObserverTrigger } ,
8
8
prelude:: * ,
9
9
query:: DebugCheckedUnwrap ,
@@ -273,7 +273,7 @@ pub struct Observer {
273
273
system : Box < dyn Any + Send + Sync + ' static > ,
274
274
descriptor : ObserverDescriptor ,
275
275
hook_on_add : ComponentHook ,
276
- error_handler : Option < fn ( BevyError , ErrorContext ) > ,
276
+ error_handler : Option < ErrorHandler > ,
277
277
}
278
278
279
279
impl Observer {
@@ -380,7 +380,6 @@ fn observer_system_runner<E: Event, B: Bundle, S: ObserverSystem<E, B>>(
380
380
. get :: < Observer > ( )
381
381
. debug_checked_unwrap ( )
382
382
. error_handler
383
- . debug_checked_unwrap ( )
384
383
} ;
385
384
386
385
let trigger: Trigger < E , B > = Trigger :: new (
@@ -409,7 +408,8 @@ fn observer_system_runner<E: Event, B: Bundle, S: ObserverSystem<E, B>>(
409
408
match ( * system) . validate_param_unsafe ( world) {
410
409
Ok ( ( ) ) => {
411
410
if let Err ( err) = ( * system) . run_unsafe ( trigger, world) {
412
- error_handler (
411
+ let handler = error_handler. unwrap_or_else ( || world. default_error_handler ( ) ) ;
412
+ handler (
413
413
err,
414
414
ErrorContext :: Observer {
415
415
name : ( * system) . name ( ) ,
@@ -421,7 +421,8 @@ fn observer_system_runner<E: Event, B: Bundle, S: ObserverSystem<E, B>>(
421
421
}
422
422
Err ( e) => {
423
423
if !e. skipped {
424
- error_handler (
424
+ let handler = error_handler. unwrap_or_else ( || world. default_error_handler ( ) ) ;
425
+ handler (
425
426
e. into ( ) ,
426
427
ErrorContext :: Observer {
427
428
name : ( * system) . name ( ) ,
@@ -458,15 +459,10 @@ fn hook_on_add<E: Event, B: Bundle, S: ObserverSystem<E, B>>(
458
459
..Default :: default ( )
459
460
} ;
460
461
461
- let default_error_handler = world. default_error_handler ( ) ;
462
-
463
462
// Initialize System
464
463
let system: * mut dyn ObserverSystem < E , B > =
465
464
if let Some ( mut observe) = world. get_mut :: < Observer > ( entity) {
466
465
descriptor. merge ( & observe. descriptor ) ;
467
- if observe. error_handler . is_none ( ) {
468
- observe. error_handler = Some ( default_error_handler) ;
469
- }
470
466
let system = observe. system . downcast_mut :: < S > ( ) . unwrap ( ) ;
471
467
& mut * system
472
468
} else {
@@ -493,7 +489,11 @@ fn hook_on_add<E: Event, B: Bundle, S: ObserverSystem<E, B>>(
493
489
#[ cfg( test) ]
494
490
mod tests {
495
491
use super :: * ;
496
- use crate :: { event:: Event , observer:: Trigger } ;
492
+ use crate :: {
493
+ error:: { ignore, DefaultErrorHandler } ,
494
+ event:: Event ,
495
+ observer:: Trigger ,
496
+ } ;
497
497
498
498
#[ derive( Event ) ]
499
499
struct TriggerEvent ;
@@ -521,11 +521,20 @@ mod tests {
521
521
Err ( "I failed!" . into ( ) )
522
522
}
523
523
524
+ // Using observer error handler
524
525
let mut world = World :: default ( ) ;
525
526
world. init_resource :: < Ran > ( ) ;
526
- let observer = Observer :: new ( system) . with_error_handler ( crate :: error:: ignore) ;
527
- world. spawn ( observer) ;
528
- Schedule :: default ( ) . run ( & mut world) ;
527
+ world. spawn ( Observer :: new ( system) . with_error_handler ( ignore) ) ;
528
+ world. trigger ( TriggerEvent ) ;
529
+ assert ! ( world. resource:: <Ran >( ) . 0 ) ;
530
+
531
+ // Using world error handler
532
+ let mut world = World :: default ( ) ;
533
+ world. init_resource :: < Ran > ( ) ;
534
+ world. spawn ( Observer :: new ( system) ) ;
535
+ // Test that the correct handler is used when the observer was added
536
+ // before the default handler
537
+ world. insert_resource ( DefaultErrorHandler ( ignore) ) ;
529
538
world. trigger ( TriggerEvent ) ;
530
539
assert ! ( world. resource:: <Ran >( ) . 0 ) ;
531
540
}
0 commit comments