enthought / enthought/traitsui

An exception in ObjectColumn.key() causes segmentation fault

Open
#749 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
306
Forks
99
PR merge metrics
No merged PRs in 30d

Description

Inheriting from the `ObjectColumn` class and accidentally (or intentionally) raising an exception in its `key()` method causes a segmentation fault. This is disruptive from the GUI point of view.

```
from traits.api import Float, List, HasTraits
from traitsui.api import ObjectColumn, TableEditor, UItem, View

class Number(HasTraits):

value = Float()

class NumberColumn(ObjectColumn):

def key(self, object_):
raise RuntimeError()
# return object_.value

class ModelAndView(HasTraits):

numbers = List()

traits_view = View(
UItem(
'numbers',
editor=TableEditor(
sortable=True,
columns=[NumberColumn(name='value', label='Number')],
),
),
)

numbers = [Number(value=1.2), Number(value=0.0)]
ModelAndView(numbers=numbers).configure_traits()
```

**Console output:**
```
$ python traitsui-column-key-raises.py
Traceback (most recent call last):
File "/Users/pzahemszky/.edm/envs/02-26-traitsui-column-key-raises/lib/python3.6/site-packages/traitsui/qt4/table_model.py", line 456, in lessThan
return column.key(left) < column.key(right)
File "traitsui-column-key-raises.py", line 13, in key
raise RuntimeError()
RuntimeError
Abort trap: 6
```

Output with the `-X faulthandler` command line option

```
$ python -X faulthandler traitsui-column-key-raises.py
Traceback (most recent call last):
File "/Users/pzahemszky/.edm/envs/02-26-traitsui-column-key-raises/lib/python3.6/site-packages/traitsui/qt4/table_model.py", line 456, in lessThan
return column.key(left) < column.key(right)
File "traitsui-column-key-raises.py", line 13, in key
raise RuntimeError()
RuntimeError
Fatal Python error: Aborted

Current thread 0x000000010f801dc0 (most recent call first):
File "/Users/pzahemszky/.edm/envs/02-26-traitsui-column-key-raises/lib/python3.6/site-packages/traitsui/qt4/table_editor.py", line 199 in init
File "/Users/pzahemszky/.edm/envs/02-26-traitsui-column-key-raises/lib/python3.6/site-packages/traitsui/editor.py", line 170 in prepare
File "/Users/pzahemszky/.edm/envs/02-26-traitsui-column-key-raises/lib/python3.6/site-packages/traitsui/qt4/ui_panel.py", line 876 in _add_items
File "/Users/pzahemszky/.edm/envs/02-26-traitsui-column-key-raises/lib/python3.6/site-packages/traitsui/qt4/ui_panel.py", line 605 in __init__
File "/Users/pzahemszky/.edm/envs/02-26-traitsui-column-key-raises/lib/python3.6/site-packages/traitsui/qt4/ui_panel.py", line 265 in panel
File "/Users/pzahemszky/.edm/envs/02-26-traitsui-column-key-raises/lib/python3.6/site-packages/traitsui/qt4/ui_live.py", line 203 in init
File "/Users/pzahemszky/.edm/envs/02-26-traitsui-column-key-raises/lib/python3.6/site-packages/traitsui/qt4/ui_base.py", line 278 in display_ui
File "/Users/pzahemszky/.edm/envs/02-26-traitsui-column-key-raises/lib/python3.6/site-packages/traitsui/qt4/ui_live.py", line 63 in _ui_dialog
File "/Users/pzahemszky/.edm/envs/02-26-traitsui-column-key-raises/lib/python3.6/site-packages/traitsui/qt4/ui_live.py", line 41 in ui_live
File "/Users/pzahemszky/.edm/envs/02-26-traitsui-column-key-raises/lib/python3.6/site-packages/traitsui/qt4/toolkit.py", line 166 in ui_live
File "/Users/pzahemszky/.edm/envs/02-26-traitsui-column-key-raises/lib/python3.6/site-packages/traitsui/ui.py", line 244 in ui
File "/Users/pzahemszky/.edm/envs/02-26-traitsui-column-key-raises/lib/python3.6/site-packages/traitsui/view.py", line 446 in ui
File "/Users/pzahemszky/.edm/envs/02-26-traitsui-column-key-raises/lib/python3.6/site-packages/traitsui/qt4/view_application.py", line 128 in __init__
File "/Users/pzahemszky/.edm/envs/02-26-traitsui-column-key-raises/lib/python3.6/site-packages/traitsui/qt4/view_application.py", line 85 in view_application
File "/Users/pzahemszky/.edm/envs/02-26-traitsui-column-key-raises/lib/python3.6/site-packages/traitsui/qt4/toolkit.py", line 224 in view_application
File "/Users/pzahemszky/.edm/envs/02-26-traitsui-column-key-raises/lib/python3.6/site-packages/traits/has_traits.py", line 2088 in configure_traits
File "traitsui-column-key-raises.py", line 33 in
Abort trap: 6
```

**Expected behaviour:**
I would expect the GUI window to appear, some kind of traceback that is displayed on the console but handled by TraitsUI, and the window to stay open after the error.

**Note:**
When I replace the `raise RuntimeError()` statement with `return object_.value` I get the expected behaviour: a window appears, and the "Number" column is sortable.

**Versions:**
TraitsUI 6.1.3
PyQt5 5.7.1
Qt 5.6.2
Python 3.6.9
macOS 10.15.2

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.