When things mess up
November 10, 2022 ยท View on GitHub
"People make mistakes. It's all a part of growing up and you never really stop growing" - Duke of nuts (Adventure time)
Setup problem detection
For detectable setup problems react-beautiful-dnd will log some information console for development builds (process.env.NODE_ENV !== 'production'). These logs are stripped from productions builds to save kbs and to keep the console clean. Keep in mind, that any setup errors that are logged will cause things to break in fun and interesting ways - so it is worth ensuring that there are none.

Log rather than throw setup errors
Some setup problems will cause errors. These are logged with console.error. We do not throw these errors. This is because an infinite loop can be created.
More details if you are interested
If we threw setup errors, here is the infinite loop:
- Mount application
- Error detected (we usually do it in a
useEffect) and thrown - Error caught in
componentDidCatch - React tree recovered (remounted). Goto step 2.
We could work around this loop condition, but it would lead to conditionally throwing, and otherwise logging. It is also tricky to avoid double logging of errors. Given that we are trying to recover the React tree, there is not a lot of value in throwing any setup problem in the first place. So we just log the problem in the console.
Production builds
Here are a few guides on how to drop development only code from your production builds:
Disable logging
If you want to disable the warnings in development, you just need to update a flag on the window:
// disable all react-beautiful-dnd development warnings
window['__react-beautiful-dnd-disable-dev-warnings'] = true;
Note: this will not strip the messages from your production builds. See above for how to do that
Error recovery
An error can occur when:
- A
Erroris explicitlythrown byreact-beautiful-dnd(an rbd error) - A
Erroristhrown by something else (a non-rbd error) - A runtime error occurs (eg
SyntaxError,TypeError)
React error boundaries do not catch all errors that can occur in rbd. So rbd uses a React error boundary as well as a window error event listener.
Error is caught by a rbd error boundary
rbd error
- cancel any active drag (no choice about this really, an error unmounts everything under the error boundary)
- log the error (non-production builds; will respect disabled logging)
- recover the React tree
non-rbd error or runtime error
- can any active drag
throwthe error for your own error boundary. We will not recover from errors that are not caused explicitly byrbd. A run time error (such as aTypeError) that is caused byrbdwill not be recovered.rbdwill only recover from explicitly thrownrbderrors.
Error is caught by window error listener
rbd error
- Cancel any active drag.
- Log a warning stating that the drag has been cancelled (non-production builds; will respect disabled logging)
- Log the error
- Call
event.preventDefault()on the event. This marks the event as consumed. See how we use DOM events. It will also prevent any 'uncaught error' warnings in yourconsole.
non-rbd error or runtime error
- Cancel any active drag.
- Log a warning stating that the drag has been cancelled (non-production builds; will respect disabled logging)