Skip to content

Unhelful error message when accessing connection attributes in subclass constructor #385

@doerwalter

Description

@doerwalter
  1. What versions are you using?

database: 21 XE
platform.platform: macOS-14.6.1-arm64-arm-64bit
sys.maxsize > 2**32: True
platform.python_version: 3.12.4
oracledb.version: 2.4.1

  1. Is it an error or a hang or a crash?

An exception happens when I access certain attributes in the constructor of a Connection subclass before calling the base class' __init__.

  1. What error(s) or behavior you are seeing?

The following Python code:

import oracledb

class C(oracledb.Connection):
    def __init__(self, *args, **kwargs):
        self.outputtypehandler = None
        super().__init__(self, *args, **kwargs)


db = C("user/pwd@db")

results in the following output:

Traceback (most recent call last):
  File "/Users/walter/checkouts/LivingLogic.Python.xist/oracledb_issue.py", line 9, in <module>
    db = C("user/pwd@db")
         ^^^^^^^^^^^^^^^^
  File "/Users/walter/checkouts/LivingLogic.Python.xist/oracledb_issue.py", line 5, in __init__
    self.outputtypehandler = None
    ^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/walter/pyvenvs/default/lib/python3.12/site-packages/oracledb/connection.py", line 376, in outputtypehandler
    self._verify_connected()
  File "/Users/walter/pyvenvs/default/lib/python3.12/site-packages/oracledb/connection.py", line 85, in _verify_connected
    if self._impl is None:
       ^^^^^^^^^^
AttributeError: 'C' object has no attribute '_impl'
Exception ignored in: <function Connection.__del__ at 0x106208cc0>
Traceback (most recent call last):
  File "/Users/walter/pyvenvs/default/lib/python3.12/site-packages/oracledb/connection.py", line 568, in __del__
    if self._impl is not None:
       ^^^^^^^^^^
AttributeError: 'C' object has no attribute '_impl'

I realize that this is probably a borderline use and a fix for the code is simple: Move setting the outputtypehandler attribute after the call to the base class' __init__. However the stacktrace (and the fact, that a second exception happens in __del__) suggests that oracledb's code seems to be unprepared for such cases, so it might be good to look into that problem nonetheless.

  1. Does your application call init_oracle_client()?

No.

  1. Include a runnable Python script that shows the problem.

See above.

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