# ERROR: tearDownClass (tests.test_db.TestDB)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tests/test_db.py", line 30, in tearDownClass
    cls.conn.close()
AttributeError: 'NoneType' object has no attribute 'close'

- **ID:** `python/unittest-teardown-order-failure`
- **Domain:** python
- **Category:** runtime_error
- **Verification:** ai_generated
- **Fix Rate:** 80%

## Root Cause

setUpClass failed earlier (e.g., DB connection refused), so cls.conn was never assigned. unittest still runs tearDownClass, which then dereferences None.

## Version Compatibility

| Version | Status | Introduced | Deprecated |
|---------|--------|------------|------------|
| 3.8 | active | — | — |

## Workarounds

1. **** (95% success)
   ```
   @classmethod
def tearDownClass(cls):
    if getattr(cls, 'conn', None) is not None:
        cls.conn.close()
        cls.conn = None
   ```
2. **** (93% success)
   ```
   @classmethod
def setUpClass(cls):
    cls.conn = connect()
    cls.addClassCleanup(cls.conn.close)
   ```

## Dead Ends

- **** — Silences the teardown error but leaves real resources (sockets, files) leaked when setUpClass partially succeeded. (75% fail)
- **** — Reconnects per test, dramatically slowing the suite; also does not fix the case where setUpClass itself fails. (70% fail)
