bevy/errors/B0003.md
François d4ffd4ff28
fix B0003 example and update logs (#11162)
# Objective

- Example in error B0003 is not failing anymore after #9822

## Solution

- Update the example code so that is always fail
- Also update logs and instructions on how to debug as it's easier now

---------

Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
2024-01-10 21:40:24 +00:00

2.7 KiB

B0003

As commands are executed asynchronously, it is possible to issue a command on an entity that will no longer exist at the time of the command execution.

Erroneous code example:

use bevy::prelude::*;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_systems(Startup, setup)
        .add_systems(Update, (use_0_and_despawn_1, use_1_and_despawn_0))
        .run();
}

#[derive(Resource)]
struct MyEntities(Entity, Entity);

#[derive(Component)]
struct Hello;

fn setup(mut commands: Commands) {
    let entity1 = commands.spawn_empty().id();
    let entity2 = commands.spawn_empty().id();
    commands.insert_resource(MyEntities(entity1, entity2));
}

fn use_0_and_despawn_1(mut commands: Commands, my_entities: Res<MyEntities>) {
    commands.entity(my_entities.0).insert(Hello);
    commands.entity(my_entities.1).despawn();
}

fn use_1_and_despawn_0(mut commands: Commands, my_entities: Res<MyEntities>) {
    commands.entity(my_entities.1).insert(Hello);
    commands.entity(my_entities.0).despawn();
}

This will panic, as the system that is executed first will despawn the entity used by the second.

The default panic message is telling you which entity doesn't exist (2v0 in the example log just below), the command that failed (adding a component Hello) and the system from which it originated (use_1_and_despawn_0):

thread 'main' panicked at /bevy/crates/bevy_ecs/src/system/commands/mod.rs:1097:13:
error[B0003]: Could not insert a bundle (of type `use_entity_after_despawn::Hello`) for entity 2v0 because it doesn't exist in this World.
Encountered a panic when applying buffers for system `use_entity_after_despawn::use_1_and_despawn_0`!
Encountered a panic in system `bevy_app::main_schedule::Main::run_main`!

To get the system that created the despawn command, you can enable DEBUG logs for crate bevy_ecs, for example by setting the environment variable RUST_LOG=bevy_ecs=debug or by configuring the LogPlugin. This will log:

DEBUG system_commands{name="use_entity_after_despawn::use_0_and_despawn_1"}: bevy_ecs::world::entity_ref: Despawning entity 2v0
thread 'main' panicked at /bevy/crates/bevy_ecs/src/system/commands/mod.rs:1097:13:
error[B0003]: Could not insert a bundle (of type `use_entity_after_despawn::Hello`) for entity 2v0 because it doesn't exist in this World.
Encountered a panic when applying buffers for system `use_entity_after_despawn::use_1_and_despawn_0`!
Encountered a panic in system `bevy_app::main_schedule::Main::run_main`!

From the first line, you know the entity 2v0 was despawned when executing a command from system use_0_and_despawn_1. In a real case, you could have many log lines, you will need to search for the exact entity from the panic message.