Good error handling follows patterns:
- Catch errors at boundaries (API handlers, event listeners)
- Don't catch errors you can't handle
- Provide context in error messages
- Log errors for debugging
- Give users actionable feedback
Avoid catching all errors silently. Hidden failures are worse than crashes.