Skip to content

Fix potential file handle leak in MetricWriter.__init__ #17

@msto

Description

@msto

Source: Expert Software Review (2026-02-17) — Edge Cases and Undefined Behavior

Description

In MetricWriter.__init__(), the file is opened on line 65 before DictWriter is constructed (line 67) and writeheader() is called (line 74). If either of those calls raises an exception, the file handle stored in self._fout will never be closed.

# metric_writer.py:64-74
self._fout = Path(filename).open("w")

self._writer = DictWriter(
    f=self._fout,
    fieldnames=self._metric_class._header_fieldnames(),
    delimiter=delimiter,
    lineterminator=lineterminator,
)

self._writer.writeheader()

If _header_fieldnames() or writeheader() raises, _fout is open but never closed.

Suggested fix

Wrap the post-open logic in a try/except that closes the file on failure:

self._fout = Path(filename).open("w")
try:
    self._writer = DictWriter(
        f=self._fout,
        fieldnames=self._metric_class._header_fieldnames(),
        delimiter=delimiter,
        lineterminator=lineterminator,
    )
    self._writer.writeheader()
except Exception:
    self._fout.close()
    raise

Acceptance Criteria

  • MetricWriter.__init__ closes file handle on failure via try/except
  • Test added verifying file is closed when init raises
  • All existing tests still pass

Issue ID: ISS-001
Created from: agent_notes/issues/issues_2026-02-17_fgmetric_review.md

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions