{"record":{"id":"ab10f653d10c65b2","repo":"emberjs/ember.js","slug":"attempted-to-rerender-but-the-ember-application-h","errorCode":null,"errorMessage":"Attempted to rerender, but the Ember application has had an unrecoverable error occur during render. You should reload the application after fixing the cause of the error.","messagePattern":"Attempted to rerender, but the Ember application has had an unrecoverable error occur during render\\. You should reload the application after fixing the cause of the error\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"packages/@ember/-internals/glimmer/lib/base-renderer.ts","lineNumber":56,"sourceCode":"\n// This wrapper logic prevents us from rerendering in case of a hard failure\n// during render. This prevents infinite revalidation type loops from occuring,\n// and ensures that errors are not swallowed by subsequent follow on failures.\nexport function errorLoopTransaction(fn: () => void) {\n  if (DEBUG) {\n    return () => {\n      let didError = true;\n\n      try {\n        fn();\n        didError = false;\n      } finally {\n        if (didError) {\n          // Noop the function so that we won't keep calling it and causing\n          // infinite looping failures;\n          fn = () => {\n            // eslint-disable-next-line no-console\n            console.warn(\n              'Attempted to rerender, but the Ember application has had an unrecoverable error occur during render. You should reload the application after fixing the cause of the error.'\n            );\n          };\n        }\n      }\n    };\n  } else {\n    return fn;\n  }\n}\n\n/**\n * The interface the `RendererState` needs from a render root. The base\n * renderer only ever creates `ComponentRootState`s; the classic renderer\n * (`./renderer`) adds `ClassicRootState` for outlet/classic-component roots.\n */\nexport interface RendererRoot {\n  readonly type: string;","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/emberjs/ember.js/blob/26f97246a8bf2e28edf26ac3093da2e86c04ffc5/packages/@ember/-internals/glimmer/lib/base-renderer.ts#L38-L74","documentation":"In base-renderer, after a render pass throws, errorLoopTransaction replaces the render function with a noop that console.warns this message, preventing infinite rerender loops when Ember retries rendering after an unrecoverable error. Hitting this means a previous render errored so badly the renderer disabled further renders until reload.","triggerScenarios":"A template/component render threw an exception; the renderer's error loop attempted to rerender and the poisoned fn warned instead of rendering again.","commonSituations":"Bugs in a component template/helper crashing during render (undefined property access in strict helpers, infinite recursion); Glimmer VM internal errors; development-time HMR bugs; corrupted component state after a thrown error.","solutions":["Fix the root cause: find the original error logged before this warning (scroll up in console) and repair the component/template/helper.","Reload the application after deploying the fix, as the renderer cannot recover in-session.","Guard templates against undefined/null values that crash helpers.","Wrap risky computed/helper logic in try/catch or safe defaults."],"exampleFix":"// before\n{{(this.items.firstObject.name.toUpperCase)}}\n// after\n{{(if this.items.firstObject (uppercase this.items.firstObject.name) '')}}","handlingStrategy":"validation","validationCode":"// Validate render inputs before they hit templates\nfunction assertRenderSafe(component) {\n  if (component.args == null) throw new Error('component rendered without args');\n}\nassertRenderSafe(this);","typeGuard":"function isRenderable(v) { return v !== undefined && v !== null; }","tryCatchPattern":"// The renderer turns the rerender fn into a console.warn noop; treat the warning as fatal\nwindow.addEventListener('error', e => {\n  if (String(e.message).includes('Attempted to rerender')) { reportFatalRenderLoop(); }\n});","preventionTips":["Read the FIRST error in the console — this warning always follows an earlier render exception.","Null-guard nullable data before it reaches templates/helpers.","Avoid helpers/computeds that can throw during render (infinite recursion, deep property access on undefined).","Add component tests that render with empty/undefined data."],"tags":["rendering","glimmer","ember"],"backgroundTag":"unrecoverable-render-error","analyzedSha":"26f97246a8bf2e28edf26ac3093da2e86c04ffc5","analyzedAt":"2026-09-01T05:01:28.182Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}