{"record":{"id":"748dbf55a3e9dea5","repo":"apache/beam","slug":"error-collections-cannot-be-added-after-error-handler-is","errorCode":null,"errorMessage":"Error collections cannot be added after Error Handler is closed","messagePattern":"Error collections cannot be added after Error Handler is closed","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/errorhandling/ErrorHandler.java","lineNumber":122,"sourceCode":"    public PTransformErrorHandler(\n        PTransform<PCollection<ErrorT>, OutputT> sinkTransform,\n        Pipeline pipeline,\n        Coder<ErrorT> coder) {\n      this.sinkTransform = sinkTransform;\n      this.pipeline = pipeline;\n      this.coder = coder;\n    }\n\n    private void readObject(ObjectInputStream aInputStream)\n        throws ClassNotFoundException, IOException {\n      aInputStream.defaultReadObject();\n      errorCollections = new ArrayList<>();\n    }\n\n    @Override\n    public void addErrorCollection(PCollection<ErrorT> errorCollection) {\n      if (isClosed()) {\n        throw new IllegalStateException(\n            \"Error collections cannot be added after Error Handler is closed\");\n      }\n      errorCollections.add(errorCollection);\n    }\n\n    @Override\n    public boolean isClosed() {\n      return closed;\n    }\n\n    @Override\n    public @Nullable OutputT getOutput() {\n      if (!this.isClosed()) {\n        throw new IllegalStateException(\n            \"ErrorHandler must be finalized before the output can be returned\");\n      }\n      return sinkOutput;\n    }","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/errorhandling/ErrorHandler.java#L104-L140","documentation":"ErrorHandler.addErrorCollection throws IllegalStateException if you try to register an error PCollection after the handler has been closed. Once close() runs, the handler flattens its error collections into the sink output, so late additions would be silently dropped — Beam forbids them.","triggerScenarios":"Calling errorHandler.addErrorCollection(pcollection) after errorHandler.close() has been invoked — typically when application code finalizes the handler (e.g. in a finally block or via try-with-resources __exit__) before all error PCollections from transforms have been registered.","commonSituations":"Using the handler in try-with-resources while building the pipeline afterwards; closing the handler in one method and adding collections in another; restructuring pipeline-building code so close() happens earlier than intended.","solutions":["Register all error PCollections before calling close().","Restructure so the handler is closed only after pipeline construction is complete.","Check isClosed() before adding, or add all collections in the same scope that builds the pipeline."],"exampleFix":"// before\nhandler.close();\nhandler.addErrorCollection(errorPcoll); // IllegalStateException\n// after\nhandler.addErrorCollection(errorPcoll);\nhandler.close();","handlingStrategy":"type-guard","validationCode":"if (!errorHandler.isClosed()) { errorHandler.addErrorCollection(errorPcoll); }","typeGuard":"boolean canAdd(ErrorHandler<?> h) {\n  try { return !h.isClosed(); } catch (IllegalStateException e) { return false; }\n}","tryCatchPattern":"try {\n  errorHandler.addErrorCollection(errorPcoll);\n} catch (IllegalStateException e) {\n  throw new IllegalStateException(\"Register error collections before closing the handler\", e);\n}","preventionTips":["Register all error PCollections during pipeline construction only","Close the handler in try-with-resources after registration is complete","Keep handler add/close calls in one scope"],"tags":["java","apache-beam","error-handling","illegal-state","lifecycle"],"backgroundTag":"invalid-state-transition","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}