bevy_ecs/error/
handler.rs1use core::fmt::Display;
2
3use crate::{component::Tick, error::BevyError, prelude::Resource};
4use bevy_utils::prelude::DebugName;
5use derive_more::derive::{Deref, DerefMut};
6
7#[derive(Debug, PartialEq, Eq, Clone)]
9pub enum ErrorContext {
10 System {
12 name: DebugName,
14 last_run: Tick,
16 },
17 RunCondition {
19 name: DebugName,
21 last_run: Tick,
23 system: DebugName,
25 on_set: bool,
27 },
28 Command {
30 name: DebugName,
32 },
33 Observer {
35 name: DebugName,
37 last_run: Tick,
39 },
40}
41
42impl Display for ErrorContext {
43 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
44 match self {
45 Self::System { name, .. } => {
46 write!(f, "System `{name}` failed")
47 }
48 Self::Command { name } => write!(f, "Command `{name}` failed"),
49 Self::Observer { name, .. } => {
50 write!(f, "Observer `{name}` failed")
51 }
52 Self::RunCondition {
53 name,
54 system,
55 on_set,
56 ..
57 } => {
58 write!(
59 f,
60 "Run condition `{name}` failed for{} system `{system}`",
61 if *on_set { " set containing" } else { "" }
62 )
63 }
64 }
65 }
66}
67
68impl ErrorContext {
69 pub fn name(&self) -> DebugName {
71 match self {
72 Self::System { name, .. }
73 | Self::Command { name, .. }
74 | Self::Observer { name, .. }
75 | Self::RunCondition { name, .. } => name.clone(),
76 }
77 }
78
79 pub fn kind(&self) -> &str {
83 match self {
84 Self::System { .. } => "system",
85 Self::Command { .. } => "command",
86 Self::Observer { .. } => "observer",
87 Self::RunCondition { .. } => "run condition",
88 }
89 }
90}
91
92macro_rules! inner {
93 ($call:path, $e:ident, $c:ident) => {
94 $call!(
95 "Encountered an error in {} `{}`: {}",
96 $c.kind(),
97 $c.name(),
98 $e
99 );
100 };
101}
102
103pub type ErrorHandler = fn(BevyError, ErrorContext);
105
106#[derive(Resource, Deref, DerefMut, Copy, Clone)]
114pub struct DefaultErrorHandler(pub ErrorHandler);
115
116impl Default for DefaultErrorHandler {
117 fn default() -> Self {
118 Self(panic)
119 }
120}
121
122#[track_caller]
124#[inline]
125pub fn panic(error: BevyError, ctx: ErrorContext) {
126 inner!(panic, error, ctx);
127}
128
129#[track_caller]
131#[inline]
132pub fn error(error: BevyError, ctx: ErrorContext) {
133 inner!(log::error, error, ctx);
134}
135
136#[track_caller]
138#[inline]
139pub fn warn(error: BevyError, ctx: ErrorContext) {
140 inner!(log::warn, error, ctx);
141}
142
143#[track_caller]
145#[inline]
146pub fn info(error: BevyError, ctx: ErrorContext) {
147 inner!(log::info, error, ctx);
148}
149
150#[track_caller]
152#[inline]
153pub fn debug(error: BevyError, ctx: ErrorContext) {
154 inner!(log::debug, error, ctx);
155}
156
157#[track_caller]
159#[inline]
160pub fn trace(error: BevyError, ctx: ErrorContext) {
161 inner!(log::trace, error, ctx);
162}
163
164#[track_caller]
166#[inline]
167pub fn ignore(_: BevyError, _: ErrorContext) {}