enthought / enthought/traitsui
An exception in ObjectColumn.key() causes segmentation fault
- 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.