From 464209b6e5b81bc57b6d1b5ed22f5668652a5e46 Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Fri, 4 Aug 2023 10:40:32 +0200
Subject: [PATCH] pamhyr: Catch some table data type exception (crash Fix).

---
 src/View/BoundaryCondition/Edit/Table.py      | 13 ++--
 .../BoundaryCondition/Edit/UndoCommand.py     |  3 +-
 src/View/BoundaryCondition/Table.py           | 41 +++++++-----
 src/View/BoundaryCondition/UndoCommand.py     |  2 +-
 src/View/Frictions/Table.py                   | 59 +++++++++--------
 src/View/Frictions/UndoCommand.py             |  6 +-
 src/View/Geometry/Profile/Table.py            | 64 +++++++++++--------
 src/View/Geometry/Profile/UndoCommand.py      | 18 +++++-
 src/View/Geometry/Table.py                    | 33 ++++++----
 src/View/Geometry/UndoCommand.py              | 10 ++-
 src/View/InitialConditions/Table.py           | 18 ++++--
 src/View/InitialConditions/UndoCommand.py     |  7 +-
 src/View/LateralContribution/Edit/Table.py    | 13 ++--
 .../LateralContribution/Edit/UndoCommand.py   |  3 +-
 src/View/LateralContribution/Table.py         | 61 ++++++++++--------
 src/View/LateralContribution/UndoCommand.py   |  6 +-
 src/View/Network/Table.py                     | 53 ++++++++-------
 src/View/SolverParameters/Table.py            | 23 ++++---
 src/View/SolverParameters/UndoCommand.py      |  2 +-
 src/View/Stricklers/Table.py                  | 50 +++++++++------
 src/View/Stricklers/UndoCommand.py            |  8 +--
 21 files changed, 303 insertions(+), 190 deletions(-)

diff --git a/src/View/BoundaryCondition/Edit/Table.py b/src/View/BoundaryCondition/Edit/Table.py
index d479ea46..6536bd0d 100644
--- a/src/View/BoundaryCondition/Edit/Table.py
+++ b/src/View/BoundaryCondition/Edit/Table.py
@@ -17,6 +17,7 @@
 # -*- coding: utf-8 -*-
 
 import logging
+import traceback
 
 from datetime import date, time, datetime, timedelta
 
@@ -212,11 +213,15 @@ class TableModel(QAbstractTableModel):
         row = index.row()
         column = index.column()
 
-        self._undo.push(
-            SetDataCommand(
-                self._data, row, column, value
+        try:
+            self._undo.push(
+                SetDataCommand(
+                    self._data, row, column, value
+                )
             )
-        )
+        except Exception as e:
+            logger.info(e)
+            logger.debug(traceback.format_exc())
 
         self.dataChanged.emit(index, index)
         return True
diff --git a/src/View/BoundaryCondition/Edit/UndoCommand.py b/src/View/BoundaryCondition/Edit/UndoCommand.py
index d2b063c9..4bb2605f 100644
--- a/src/View/BoundaryCondition/Edit/UndoCommand.py
+++ b/src/View/BoundaryCondition/Edit/UndoCommand.py
@@ -33,7 +33,8 @@ class SetDataCommand(QUndoCommand):
         self._index = index
         self._column = column
         self._old = self._data.get_i(self._index)[self._column]
-        self._new = new_value
+        _type = self._data.get_type_column(self._column)
+        self._new = _type(new_value)
 
     def undo(self):
         self._data._set_i_c_v(self._index, self._column, self._old)
diff --git a/src/View/BoundaryCondition/Table.py b/src/View/BoundaryCondition/Table.py
index d1570c05..fd39a13a 100644
--- a/src/View/BoundaryCondition/Table.py
+++ b/src/View/BoundaryCondition/Table.py
@@ -16,6 +16,9 @@
 
 # -*- coding: utf-8 -*-
 
+import logging
+import traceback
+
 from tools import trace, timer
 
 from PyQt5.QtCore import (
@@ -43,6 +46,8 @@ from View.BoundaryCondition.UndoCommand import (
 )
 from View.BoundaryCondition.translate import *
 
+logger = logging.getLogger()
+
 _translate = QCoreApplication.translate
 
 class ComboBoxDelegate(QItemDelegate):
@@ -153,25 +158,29 @@ class TableModel(QAbstractTableModel):
         row = index.row()
         column = index.column()
 
-        if self._headers[column] == "name":
-            self._undo.push(
-                SetNameCommand(
-                    self._bcs, self._tab,row, value
+        try:
+            if self._headers[column] == "name":
+                self._undo.push(
+                    SetNameCommand(
+                        self._bcs, self._tab,row, value
+                    )
                 )
-            )
-        elif self._headers[column] == "type":
-            key = next(k for k, v in long_types.items() if v == value)
-            self._undo.push(
-                SetTypeCommand(
-                    self._bcs, self._tab,row, BC_types[key]
+            elif self._headers[column] == "type":
+                key = next(k for k, v in long_types.items() if v == value)
+                self._undo.push(
+                    SetTypeCommand(
+                        self._bcs, self._tab,row, BC_types[key]
+                    )
                 )
-            )
-        elif self._headers[column] == "node":
-            self._undo.push(
-                SetNodeCommand(
-                    self._bcs, self._tab,row, self._data.node(value)
+            elif self._headers[column] == "node":
+                self._undo.push(
+                    SetNodeCommand(
+                        self._bcs, self._tab,row, self._data.node(value)
+                    )
                 )
-            )
+        except Exception as e:
+            logger.info(e)
+            logger.debug(traceback.format_exc())
 
         self.dataChanged.emit(index, index)
         return True
diff --git a/src/View/BoundaryCondition/UndoCommand.py b/src/View/BoundaryCondition/UndoCommand.py
index 9f8600c4..bbf8cb2c 100644
--- a/src/View/BoundaryCondition/UndoCommand.py
+++ b/src/View/BoundaryCondition/UndoCommand.py
@@ -34,7 +34,7 @@ class SetNameCommand(QUndoCommand):
         self._tab = tab
         self._index = index
         self._old = self._bcs.get(self._tab, self._index).name
-        self._new = new_value
+        self._new = str(new_value)
 
     def undo(self):
         self._bcs.get(self._tab, self._index).name = self._old
diff --git a/src/View/Frictions/Table.py b/src/View/Frictions/Table.py
index 8a6171da..ef9dc32f 100644
--- a/src/View/Frictions/Table.py
+++ b/src/View/Frictions/Table.py
@@ -16,6 +16,9 @@
 
 # -*- coding: utf-8 -*-
 
+import logging
+import traceback
+
 from tools import trace, timer
 
 from PyQt5.QtCore import (
@@ -40,6 +43,8 @@ from View.Frictions.UndoCommand import (
 
 from View.Frictions.translate import *
 
+logger = logging.getLogger()
+
 _translate = QCoreApplication.translate
 
 class ComboBoxDelegate(QItemDelegate):
@@ -148,36 +153,40 @@ class TableModel(QAbstractTableModel):
         row = index.row()
         column = index.column()
 
-        if self._headers[column] == "name":
-            self._undo.push(
-                SetNameCommand(
-                    self._frictions, row, value
+        try:
+            if self._headers[column] == "name":
+                self._undo.push(
+                    SetNameCommand(
+                        self._frictions, row, value
+                    )
                 )
-            )
-        elif self._headers[column] == "begin_kp":
-            self._undo.push(
-                SetBeginCommand(
-                    self._frictions, row, value
+            elif self._headers[column] == "begin_kp":
+                self._undo.push(
+                    SetBeginCommand(
+                        self._frictions, row, value
+                    )
                 )
-            )
-        elif self._headers[column] == "end_kp":
-            self._undo.push(
-                SetEndCommand(
-                    self._frictions, row, value
+            elif self._headers[column] == "end_kp":
+                self._undo.push(
+                    SetEndCommand(
+                        self._frictions, row, value
+                    )
                 )
-            )
-        elif self._headers[column] == "begin_strickler":
-            self._undo.push(
-                SetBeginStricklerCommand(
-                    self._frictions, row, self._study.river.strickler(value)
+            elif self._headers[column] == "begin_strickler":
+                self._undo.push(
+                    SetBeginStricklerCommand(
+                        self._frictions, row, self._study.river.strickler(value)
+                    )
                 )
-            )
-        elif self._headers[column] == "end_strickler":
-            self._undo.push(
-                SetEndStricklerCommand(
-                    self._frictions, row, self._study.river.strickler(value)
+            elif self._headers[column] == "end_strickler":
+                self._undo.push(
+                    SetEndStricklerCommand(
+                        self._frictions, row, self._study.river.strickler(value)
+                    )
                 )
-            )
+        except Exception as e:
+            logger.info(e)
+            logger.debug(traceback.format_exc())
 
         self.dataChanged.emit(index, index)
         return True
diff --git a/src/View/Frictions/UndoCommand.py b/src/View/Frictions/UndoCommand.py
index 911ded8a..ef902f07 100644
--- a/src/View/Frictions/UndoCommand.py
+++ b/src/View/Frictions/UndoCommand.py
@@ -33,7 +33,7 @@ class SetNameCommand(QUndoCommand):
         self._frictions = frictions
         self._index = index
         self._old = self._frictions.get(self._index).name
-        self._new = new_value
+        self._new = str(new_value)
 
     def undo(self):
         self._frictions.get(self._index).name = self._old
@@ -48,7 +48,7 @@ class SetBeginCommand(QUndoCommand):
         self._frictions = frictions
         self._index = index
         self._old = self._frictions.get(self._index).begin_kp
-        self._new = new_value
+        self._new = float(new_value)
 
     def undo(self):
         self._frictions.get(self._index).begin_kp = float(self._old)
@@ -63,7 +63,7 @@ class SetEndCommand(QUndoCommand):
         self._frictions = frictions
         self._index = index
         self._old = self._frictions.get(self._index).end_kp
-        self._new = new_value
+        self._new = float(new_value)
 
     def undo(self):
         self._frictions.get(self._index).end_kp = float(self._old)
diff --git a/src/View/Geometry/Profile/Table.py b/src/View/Geometry/Profile/Table.py
index 3d5f72df..2de665aa 100644
--- a/src/View/Geometry/Profile/Table.py
+++ b/src/View/Geometry/Profile/Table.py
@@ -17,6 +17,8 @@
 # -*- coding: utf-8 -*-
 
 import numpy as np
+import logging
+import traceback
 
 from tools import timer, trace
 
@@ -36,6 +38,8 @@ from Model.Geometry.ProfileXYZ import ProfileXYZ
 
 from View.Geometry.Profile.UndoCommand import *
 
+logger = logging.getLogger()
+
 _translate = QCoreApplication.translate
 
 
@@ -148,38 +152,42 @@ class TableEditableModel(QAbstractTableModel):
         column = index.column()
 
         if role == Qt.EditRole:
-            if column == 0:
-                self._undo_stack.push(
-                    SetXCommand(
-                        self._profile, row,
-                        self._profile.point(row).x,
-                        value
+            try:
+                if column == 0:
+                    self._undo_stack.push(
+                        SetXCommand(
+                            self._profile, row,
+                            self._profile.point(row).x,
+                            value
+                        )
                     )
-                )
-            elif column == 1:
-                self._undo_stack.push(
-                    SetYCommand(
-                        self._profile, row,
-                        self._profile.point(row).y,
-                        value
+                elif column == 1:
+                    self._undo_stack.push(
+                        SetYCommand(
+                            self._profile, row,
+                            self._profile.point(row).y,
+                            value
+                        )
                     )
-                )
-            elif column == 2:
-                self._undo_stack.push(
-                    SetZCommand(
-                        self._profile, row,
-                        self._profile.point(row).z,
-                        value
+                elif column == 2:
+                    self._undo_stack.push(
+                        SetZCommand(
+                            self._profile, row,
+                            self._profile.point(row).z,
+                            value
+                        )
                     )
-                )
-            elif column == 3:
-                self._undo_stack.push(
-                    SetNameCommand(
-                        self._profile, row,
-                        self._profile.point(row).name,
-                        value
+                elif column == 3:
+                    self._undo_stack.push(
+                        SetNameCommand(
+                            self._profile, row,
+                            self._profile.point(row).name,
+                            value
+                        )
                     )
-                )
+            except Exception as e:
+                logger.info(e)
+                logger.debug(traceback.format_exc())
 
             self.dataChanged.emit(index, index)
             return True
diff --git a/src/View/Geometry/Profile/UndoCommand.py b/src/View/Geometry/Profile/UndoCommand.py
index 166a004b..7f0cd138 100644
--- a/src/View/Geometry/Profile/UndoCommand.py
+++ b/src/View/Geometry/Profile/UndoCommand.py
@@ -32,9 +32,13 @@ class SetDataCommand(QUndoCommand):
         self._profile = profile
         self._index = index
         self._old = old_value
-        self._new = new_value
+        self._new = self.type(new_value)
 
 class SetXCommand(SetDataCommand):
+    def __init__(self, reach, index, old_value, new_value):
+        self.type = float
+        super(SetXCommand, self).__init__(reach, index, old_value, new_value)
+
     def undo(self):
         self._profile.point(self._index).x = self._old
 
@@ -42,6 +46,10 @@ class SetXCommand(SetDataCommand):
         self._profile.point(self._index).x = self._new
 
 class SetYCommand(SetDataCommand):
+    def __init__(self, reach, index, old_value, new_value):
+        self.type = float
+        super(SetYCommand, self).__init__(reach, index, old_value, new_value)
+
     def undo(self):
         self._profile.point(self._index).y = self._old
 
@@ -49,6 +57,10 @@ class SetYCommand(SetDataCommand):
         self._profile.point(self._index).y = self._new
 
 class SetZCommand(SetDataCommand):
+    def __init__(self, reach, index, old_value, new_value):
+        self.type = float
+        super(SetZCommand, self).__init__(reach, index, old_value, new_value)
+
     def undo(self):
         self._profile.point(self._index).z = self._old
 
@@ -56,6 +68,10 @@ class SetZCommand(SetDataCommand):
         self._profile.point(self._index).z = self._new
 
 class SetNameCommand(SetDataCommand):
+    def __init__(self, reach, index, old_value, new_value):
+        self.type = str
+        super(SetNameCommand, self).__init__(reach, index, old_value, new_value)
+
     def undo(self):
         self._profile.point(self._index).name = self._old
 
diff --git a/src/View/Geometry/Table.py b/src/View/Geometry/Table.py
index 63ae8e45..1b055209 100644
--- a/src/View/Geometry/Table.py
+++ b/src/View/Geometry/Table.py
@@ -17,6 +17,8 @@
 # -*- coding: utf-8 -*-
 
 import time
+import logging
+import traceback
 
 from tools import timer, trace
 
@@ -37,6 +39,7 @@ from Model.Geometry import Reach
 from Model.Geometry.ProfileXYZ import ProfileXYZ
 from View.Geometry.UndoCommand import *
 
+logger = logging.getLogger()
 
 _translate = QCoreApplication.translate
 
@@ -114,23 +117,27 @@ class TableEditableModel(QAbstractTableModel):
         column = index.column()
 
         if role == Qt.EditRole and index.column() != 2:
-            if index.column() == 0:
-                self._undo_stack.push(
-                    SetNameCommand(
-                        self._reach, index.row(),
-                        self._reach.profile(index.row()).name,
-                        value
+            try:
+                if index.column() == 0:
+                    self._undo_stack.push(
+                        SetNameCommand(
+                            self._reach, index.row(),
+                            self._reach.profile(index.row()).name,
+                            value
+                        )
                     )
-                )
 
-            if index.column() == 1:
-                self._undo_stack.push(
-                    SetKPCommand(
-                        self._reach, index.row(),
-                        self._reach.profile(index.row()).kp,
+                if index.column() == 1:
+                    self._undo_stack.push(
+                        SetKPCommand(
+                            self._reach, index.row(),
+                            self._reach.profile(index.row()).kp,
                         value
+                        )
                     )
-                )
+            except Exception as e:
+                logger.info(e)
+                logger.debug(traceback.format_exc())
 
             self.dataChanged.emit(index, index)
             self.layoutChanged.emit()
diff --git a/src/View/Geometry/UndoCommand.py b/src/View/Geometry/UndoCommand.py
index 148f7db3..1df9c58c 100644
--- a/src/View/Geometry/UndoCommand.py
+++ b/src/View/Geometry/UndoCommand.py
@@ -33,9 +33,13 @@ class SetDataCommand(QUndoCommand):
         self._reach = reach
         self._index = index
         self._old = old_value
-        self._new = new_value
+        self._new = self.type(new_value)
 
 class SetNameCommand(SetDataCommand):
+    def __init__(self, reach, index, old_value, new_value):
+        self.type = str
+        super(SetNameCommand, self).__init__(reach, index, old_value, new_value)
+
     def undo(self):
         self._reach.profile(self._index).name = self._old
 
@@ -43,6 +47,10 @@ class SetNameCommand(SetDataCommand):
         self._reach.profile(self._index).name = self._new
 
 class SetKPCommand(SetDataCommand):
+    def __init__(self, reach, index, old_value, new_value):
+        self.type = float
+        super(SetKPCommand, self).__init__(reach, index, old_value, new_value)
+
     def undo(self):
         self._reach.profile(self._index).kp = self._old
 
diff --git a/src/View/InitialConditions/Table.py b/src/View/InitialConditions/Table.py
index ebb9af85..5e704ba9 100644
--- a/src/View/InitialConditions/Table.py
+++ b/src/View/InitialConditions/Table.py
@@ -16,6 +16,8 @@
 
 # -*- coding: utf-8 -*-
 
+import logging
+import traceback
 from tools import trace, timer
 
 from PyQt5.QtCore import (
@@ -39,6 +41,8 @@ from View.InitialConditions.UndoCommand import (
 
 from View.InitialConditions.translate import *
 
+logger = logging.getLogger()
+
 _translate = QCoreApplication.translate
 
 class ComboBoxDelegate(QItemDelegate):
@@ -135,12 +139,16 @@ class TableModel(QAbstractTableModel):
         row = index.row()
         column = index.column()
 
-        if self._headers[column] is not None:
-            self._undo.push(
-                SetCommand(
-                    self._ics, row, self._headers[column], value
+        try:
+            if self._headers[column] is not None:
+                self._undo.push(
+                    SetCommand(
+                        self._ics, row, self._headers[column], value
+                    )
                 )
-            )
+        except Exception as e:
+            logger.info(e)
+            logger.debug(traceback.format_exc())
 
         self.dataChanged.emit(index, index)
         return True
diff --git a/src/View/InitialConditions/UndoCommand.py b/src/View/InitialConditions/UndoCommand.py
index 9d93f78b..c96f90fa 100644
--- a/src/View/InitialConditions/UndoCommand.py
+++ b/src/View/InitialConditions/UndoCommand.py
@@ -34,7 +34,12 @@ class SetCommand(QUndoCommand):
         self._row = row
         self._column = column
         self._old = self._ics.get(self._row)[column]
-        self._new = new_value
+
+        _type = float
+        if column == "name" or column == "comment":
+            _type = str
+
+        self._new = _type(new_value)
 
     def undo(self):
         self._ics.get(self._row)[self._column] = self._old
diff --git a/src/View/LateralContribution/Edit/Table.py b/src/View/LateralContribution/Edit/Table.py
index 0fabd5cb..e9e878fd 100644
--- a/src/View/LateralContribution/Edit/Table.py
+++ b/src/View/LateralContribution/Edit/Table.py
@@ -17,6 +17,7 @@
 # -*- coding: utf-8 -*-
 
 import logging
+import traceback
 from datetime import date, time, datetime, timedelta
 
 from tools import trace, timer
@@ -210,11 +211,15 @@ class TableModel(QAbstractTableModel):
         row = index.row()
         column = index.column()
 
-        self._undo.push(
-            SetDataCommand(
-                self._data, row, column, value
+        try:
+            self._undo.push(
+                SetDataCommand(
+                    self._data, row, column, value
+                )
             )
-        )
+        except Exception as e:
+            logger.info(e)
+            logger.debug(traceback.format_exc())
 
         self.dataChanged.emit(index, index)
         return True
diff --git a/src/View/LateralContribution/Edit/UndoCommand.py b/src/View/LateralContribution/Edit/UndoCommand.py
index a0a602bc..715683c9 100644
--- a/src/View/LateralContribution/Edit/UndoCommand.py
+++ b/src/View/LateralContribution/Edit/UndoCommand.py
@@ -33,7 +33,8 @@ class SetDataCommand(QUndoCommand):
         self._index = index
         self._column = column
         self._old = self._data.get_i(self._index)[self._column]
-        self._new = new_value
+        _type = self._data.get_type_column(self._column)
+        self._new = _type(new_value)
 
     def undo(self):
         self._data._set_i_c_v(self._index, self._column, self._old)
diff --git a/src/View/LateralContribution/Table.py b/src/View/LateralContribution/Table.py
index f5a8bdf1..682bf00d 100644
--- a/src/View/LateralContribution/Table.py
+++ b/src/View/LateralContribution/Table.py
@@ -16,6 +16,9 @@
 
 # -*- coding: utf-8 -*-
 
+import logging
+import traceback
+
 from tools import trace, timer
 
 from PyQt5.QtCore import (
@@ -43,6 +46,8 @@ from Model.LateralContribution.LateralContributionTypes import (
 )
 from View.LateralContribution.translate import *
 
+logger = logging.getLogger()
+
 _translate = QCoreApplication.translate
 
 class ComboBoxDelegate(QItemDelegate):
@@ -156,37 +161,41 @@ class TableModel(QAbstractTableModel):
         row = index.row()
         column = index.column()
 
-        if self._headers[column] == "name":
-            self._undo.push(
-                SetNameCommand(
-                    self._lcs, self._tab, row, value
+        try:
+            if self._headers[column] == "name":
+                self._undo.push(
+                    SetNameCommand(
+                        self._lcs, self._tab, row, value
+                    )
                 )
-            )
-        elif self._headers[column] == "type":
-            key = next(k for k, v in long_types.items() if v == value)
-            self._undo.push(
-                SetTypeCommand(
-                    self._lcs, self._tab, row, LC_types[key]
+            elif self._headers[column] == "type":
+                key = next(k for k, v in long_types.items() if v == value)
+                self._undo.push(
+                    SetTypeCommand(
+                        self._lcs, self._tab, row, LC_types[key]
+                    )
                 )
-            )
-        elif self._headers[column] == "edge":
-            self._undo.push(
-                SetEdgeCommand(
-                    self._lcs, self._tab, row, self._data.edge(value)
+            elif self._headers[column] == "edge":
+                self._undo.push(
+                    SetEdgeCommand(
+                        self._lcs, self._tab, row, self._data.edge(value)
+                    )
                 )
-            )
-        elif self._headers[column] == "begin_kp":
-            self._undo.push(
-                SetBeginCommand(
-                    self._lcs, self._tab, row, value
+            elif self._headers[column] == "begin_kp":
+                self._undo.push(
+                    SetBeginCommand(
+                        self._lcs, self._tab, row, value
+                    )
                 )
-            )
-        elif self._headers[column] == "end_kp":
-            self._undo.push(
-                SetEndCommand(
-                    self._lcs, self._tab, row, value
+            elif self._headers[column] == "end_kp":
+                self._undo.push(
+                    SetEndCommand(
+                        self._lcs, self._tab, row, value
+                    )
                 )
-            )
+        except Exception as e:
+            logger.info(e)
+            logger.debug(traceback.format_exc())
 
         self.dataChanged.emit(index, index)
         return True
diff --git a/src/View/LateralContribution/UndoCommand.py b/src/View/LateralContribution/UndoCommand.py
index 6b688394..3d858436 100644
--- a/src/View/LateralContribution/UndoCommand.py
+++ b/src/View/LateralContribution/UndoCommand.py
@@ -34,7 +34,7 @@ class SetNameCommand(QUndoCommand):
         self._tab = tab
         self._index = index
         self._old = self._lcs.get(self._tab, self._index).name
-        self._new = new_value
+        self._new = str(new_value)
 
     def undo(self):
         self._lcs.get(self._tab, self._index).name = self._old
@@ -50,7 +50,7 @@ class SetBeginCommand(QUndoCommand):
         self._tab = tab
         self._index = index
         self._old = self._lcs.get(self._tab, self._index).begin_kp
-        self._new = new_value
+        self._new = float(new_value)
 
     def undo(self):
         self._lcs.get(self._tab, self._index).begin_kp = float(self._old)
@@ -66,7 +66,7 @@ class SetEndCommand(QUndoCommand):
         self._tab = tab
         self._index = index
         self._old = self._lcs.get(self._tab, self._index).end_kp
-        self._new = new_value
+        self._new = float(new_value)
 
     def undo(self):
         self._lcs.get(self._tab, self._index).end_kp = float(self._old)
diff --git a/src/View/Network/Table.py b/src/View/Network/Table.py
index 1b771779..b24865e8 100644
--- a/src/View/Network/Table.py
+++ b/src/View/Network/Table.py
@@ -16,6 +16,9 @@
 
 # -*- coding: utf-8 -*-
 
+import logging
+import traceback
+
 from Model.Network.Node import Node
 from Model.Network.Edge import Edge
 from Model.Network.Graph import Graph
@@ -153,31 +156,35 @@ class GraphTableModel(QAbstractTableModel):
     def setData(self, index, value, role=Qt.EditRole):
         if index.isValid():
             if role == Qt.EditRole:
-                if (self.headers[index.column()] == "node1" or
-                    self.headers[index.column()] == "node2"):
-                    node = self.graph.node(value)
-                    self._undo.push(
-                        SetNodeCommand(
-                            self.graph,
-                            self.rows[index.row()],
-                            self.headers[index.column()],
-                            node
+                try:
+                    if (self.headers[index.column()] == "node1" or
+                        self.headers[index.column()] == "node2"):
+                        node = self.graph.node(value)
+                        self._undo.push(
+                            SetNodeCommand(
+                                self.graph,
+                                self.rows[index.row()],
+                                self.headers[index.column()],
+                                node
+                            )
                         )
-                    )
-                # elif self.headers[index.column()] == "enable":
-                #     self._undo.push(
-                #         EnableEdgeCommand(
-                #             self.rows[index.row()], value
-                #         )
-                #     )
-                else:
-                    self._undo.push(
-                        SetCommand(
-                            self.rows[index.row()],
-                            self.headers[index.column()],
-                            value
+                        # elif self.headers[index.column()] == "enable":
+                        #     self._undo.push(
+                        #         EnableEdgeCommand(
+                        #             self.rows[index.row()], value
+                        #         )
+                        #     )
+                    else:
+                        self._undo.push(
+                            SetCommand(
+                                self.rows[index.row()],
+                                self.headers[index.column()],
+                                value
+                            )
                         )
-                    )
+                except Exception as e:
+                    logger.info(e)
+                    logger.debug(traceback.format_exc())
 
                 self.dataChanged.emit(index, index, [Qt.DisplayRole])
                 self.layoutChanged.emit()
diff --git a/src/View/SolverParameters/Table.py b/src/View/SolverParameters/Table.py
index 9aa3b55b..5aa488ab 100644
--- a/src/View/SolverParameters/Table.py
+++ b/src/View/SolverParameters/Table.py
@@ -16,6 +16,9 @@
 
 # -*- coding: utf-8 -*-
 
+import logging
+import traceback
+
 from tools import trace, timer
 
 from PyQt5.QtCore import (
@@ -97,16 +100,20 @@ class TableModel(QAbstractTableModel):
         row = index.row()
         column = index.column()
 
-        if self._headers[column] == "value":
-            if value in tr.r_yes_no:
-                value = tr.r_yes_no[value].lower()
+        try:
+            if self._headers[column] == "value":
+                if value in tr.r_yes_no:
+                    value = tr.r_yes_no[value].lower()
 
-            self._undo.push(
-                SetCommand(
-                    self._params, row,
-                    "value", value
+                self._undo.push(
+                    SetCommand(
+                        self._params, row,
+                        "value", value
+                    )
                 )
-            )
+        except Exception as e:
+            logger.info(e)
+            logger.debug(traceback.format_exc())
 
         self.dataChanged.emit(index, index)
         return True
diff --git a/src/View/SolverParameters/UndoCommand.py b/src/View/SolverParameters/UndoCommand.py
index 3c917e4f..d3343d00 100644
--- a/src/View/SolverParameters/UndoCommand.py
+++ b/src/View/SolverParameters/UndoCommand.py
@@ -33,7 +33,7 @@ class SetCommand(QUndoCommand):
         self._index = index
         self._column = column
         self._old = self._data.get(self._index)[column]
-        self._new = new_value
+        self._new = str(new_value)
 
     def undo(self):
         self._data.get(self._index)[self._column] = self._old
diff --git a/src/View/Stricklers/Table.py b/src/View/Stricklers/Table.py
index 31dd4d9b..5d32cda5 100644
--- a/src/View/Stricklers/Table.py
+++ b/src/View/Stricklers/Table.py
@@ -16,6 +16,9 @@
 
 # -*- coding: utf-8 -*-
 
+import logging
+import traceback
+
 from tools import trace, timer
 
 from PyQt5.QtCore import (
@@ -39,8 +42,9 @@ from View.Stricklers.UndoCommand import (
 
 from View.Stricklers.translate import *
 
-_translate = QCoreApplication.translate
+logger = logging.getLogger()
 
+_translate = QCoreApplication.translate
 
 class TableModel(QAbstractTableModel):
     def __init__(self, data=None, undo=None, tab=""):
@@ -92,30 +96,34 @@ class TableModel(QAbstractTableModel):
         row = index.row()
         column = index.column()
 
-        if self._headers[column] == "name":
-            self._undo.push(
-                SetNameCommand(
-                    self._data, row, value
+        try:
+            if self._headers[column] == "name":
+                self._undo.push(
+                    SetNameCommand(
+                        self._data, row, value
+                    )
                 )
-            )
-        elif self._headers[column] == "comment":
-            self._undo.push(
-                SetCommentCommand(
-                    self._data, row, value
+            elif self._headers[column] == "comment":
+                self._undo.push(
+                    SetCommentCommand(
+                        self._data, row, value
+                    )
                 )
-            )
-        elif self._headers[column] == "minor":
-            self._undo.push(
-                SetMinorCommand(
-                    self._data, row, value
+            elif self._headers[column] == "minor":
+                self._undo.push(
+                    SetMinorCommand(
+                        self._data, row, value
+                    )
                 )
-            )
-        elif self._headers[column] == "medium":
-            self._undo.push(
-                SetMediumCommand(
-                    self._data, row, value
+            elif self._headers[column] == "medium":
+                self._undo.push(
+                    SetMediumCommand(
+                        self._data, row, value
+                    )
                 )
-            )
+        except Exception as e:
+            logger.info(e)
+            logger.debug(traceback.format_exc())
 
         self.dataChanged.emit(index, index)
         return True
diff --git a/src/View/Stricklers/UndoCommand.py b/src/View/Stricklers/UndoCommand.py
index e7dc733e..ee75cf99 100644
--- a/src/View/Stricklers/UndoCommand.py
+++ b/src/View/Stricklers/UndoCommand.py
@@ -33,7 +33,7 @@ class SetNameCommand(QUndoCommand):
         self._data = data
         self._index = index
         self._old = self._data.get(self._index).name
-        self._new = new_value
+        self._new = str(new_value)
 
     def undo(self):
         self._data.get(self._index).name = self._old
@@ -48,7 +48,7 @@ class SetCommentCommand(QUndoCommand):
         self._data = data
         self._index = index
         self._old = self._data.get(self._index).comment
-        self._new = new_value
+        self._new = str(new_value)
 
     def undo(self):
         self._data.get(self._index).comment = self._old
@@ -63,7 +63,7 @@ class SetMinorCommand(QUndoCommand):
         self._data = data
         self._index = index
         self._old = self._data.get(self._index).minor
-        self._new = new_value
+        self._new = float(new_value)
 
     def undo(self):
         self._data.get(self._index).minor = self._old
@@ -78,7 +78,7 @@ class SetMediumCommand(QUndoCommand):
         self._data = data
         self._index = index
         self._old = self._data.get(self._index).medium
-        self._new = new_value
+        self._new = float(new_value)
 
     def undo(self):
         self._data.get(self._index).medium = self._old
-- 
GitLab