Skip to content

Error Handling

omar edited this page Sep 27, 2024 · 7 revisions

Since Dear ImGui 1.91.3 we provide way to configure how to handle SOME recoverable errors.

  • Error recovery is provided as a way to facilitate recovery from errors in e.g. scripting languages, or after specific exceptions handlers.
  • Error recovery is not perfect nor guaranteed! You are not supposed to rely on it in the course of a normal application run.
  • Always ensure that on programmers seat you have at minimum Asserts or Tooltips enabled when making direct imgui API call! Otherwise it would severely hinder your ability to catch and correct mistakes!

Typical scenarios:

(1) Programmer seats (current default)

  • Recoverable errors will call IM_ASSERT_USER_ERROR(), leading to IM_ASSERT() being executed.
  • If you can resume execution from your assert, recovery will generally be performed.
  • If you can configure your assert to be ignored, recover will generally be performed and the error tooltip will be visible.

(2) Programmer seats: if you disable Asserts (either via ImGuiErrorFlags_NoAssert either via a disabled IM_ASSERT macros) but keep Tooltips:

  • Recoverable errors will be visible in an error tooltip.
  • The error tooltip will allow user to enable asserts.
  • THIS IMPLICITLY RELY ON RECOVERY BEING FUNCTIONAL. A FEW CASES MIGHT PROBABLY STILL CRASH/ASSERTS.

(3) Non-programmer seats: what you might want to setup:

  • Use ImGuiErrorFlags_NoAssert, but make sure log entries are well visible or reported somewhere.
  • If errors are not well resurfaced to programmers, it may hinder your ability to prevent errors from staying/spreading in the codebase. Use with caution!

(4) If you offer the ability to write Dear ImGui code via e.g. scripting language, you may want to:

  • Use ErrorRecoveryStoreState() to record stack sizes before running the script interpreter.
  • Use ImGuiErrorFlags_NoAssert but only while in the context of the script interpreter.
  • Maybe trigger a script break from your ErrorCallback if you can.
  • Ensure that e.g ImGuiErrorFlags_NoTooltip is NOT set, and that log entries are well surfaced and visible somewhere.

(5) To handle resuming code execution after an exception:

  • Use ErrorRecoveryStoreState() to record stack sizes before your try {} block.
  • Temporary adjust settings (e.g. disable assert, set a log callback).
  • Call ErrorRecoveryTryToRecoverState().
  • Restore settings.

Clone this wiki locally