diff --git a/b_asic/GUI/drag_button.py b/b_asic/GUI/drag_button.py
index 9f10c1cebc9c8590a5a671063a15739954fb4a49..e31c6b5a27ef887f3f5699b124d5241aee8d8d8a 100644
--- a/b_asic/GUI/drag_button.py
+++ b/b_asic/GUI/drag_button.py
@@ -3,23 +3,25 @@ Drag button class.
 This class creates a dragbutton which can be clicked, dragged and dropped.
 """
 
-
 import os.path
 
 from PyQt5.QtWidgets import QPushButton
 from PyQt5.QtCore import Qt, QSize
 from PyQt5.QtGui import QIcon
 
+from utils import decorate_class, handle_error
+
 
+@decorate_class(handle_error)
 class DragButton(QPushButton):
     def __init__(self, name, operation, operation_path_name, window, parent = None):
         self.name = name
-        self.__window = window
+        self._window = window
         self.operation = operation
         self.operation_path_name = operation_path_name
         self.clicked = 0
         self.pressed = False
-        super(DragButton, self).__init__(self.__window)
+        super(DragButton, self).__init__(self._window)
 
     def mousePressEvent(self, event):
         self._mouse_press_pos = None
@@ -29,7 +31,7 @@ class DragButton(QPushButton):
             self._mouse_press_pos = event.globalPos()
             self._mouse_move_pos = event.globalPos()
 
-            for signal in self.__window.signalList:
+            for signal in self._window.signalList:
                 signal.update()
 
             self.clicked += 1
@@ -40,7 +42,7 @@ class DragButton(QPushButton):
                 path_to_image = os.path.join('operation_icons', self.operation_path_name + '_grey.png')
                 self.setIcon(QIcon(path_to_image))
                 self.setIconSize(QSize(50, 50))
-                self.__window.pressed_button.append(self)
+                self._window.pressed_button.append(self)
 
             elif self.clicked == 2:
                 self.clicked = 0
@@ -50,7 +52,7 @@ class DragButton(QPushButton):
                 path_to_image = os.path.join('operation_icons', self.operation_path_name + '.png')
                 self.setIcon(QIcon(path_to_image))
                 self.setIconSize(QSize(50, 50))
-                self.__window.pressed_button.remove(self)
+                self._window.pressed_button.remove(self)
 
         super(DragButton, self).mousePressEvent(event)
 
@@ -63,8 +65,8 @@ class DragButton(QPushButton):
             self.move(new_pos)
 
             self._mouse_move_pos = global_pos
-        
-        self.__window.update()
+
+        self._window.update()
         super(DragButton, self).mouseMoveEvent(event)
 
     def mouseReleaseEvent(self, event):
diff --git a/b_asic/GUI/improved_main_window.py b/b_asic/GUI/improved_main_window.py
index fb580eb9a0cf67305e3b8a322538cc30b75a7569..2696de2539a5b79a2a8b0e355eab4026d4c6c4d6 100644
--- a/b_asic/GUI/improved_main_window.py
+++ b/b_asic/GUI/improved_main_window.py
@@ -14,6 +14,7 @@ from port_button import PortButton
 from b_asic import Operation
 import b_asic.core_operations as c_oper
 import b_asic.special_operations as s_oper
+from utils import decorate_class, handle_error
 
 from numpy import linspace
 
@@ -25,6 +26,7 @@ from PyQt5.QtCore import Qt, QSize
 from PyQt5.QtGui import QIcon, QFont, QPainter, QPen, QBrush, QKeySequence
 
 
+@decorate_class(handle_error)
 class MainWindow(QMainWindow):
     def __init__(self):
         super(MainWindow, self).__init__()
@@ -41,6 +43,7 @@ class MainWindow(QMainWindow):
         self.portList = []
         self.pressed_ports = []
         self.source = None
+        self._window = self
 
         self.init_ui()
         self.add_operations_from_namespace(c_oper, self.ui.core_operations_list)
@@ -141,7 +144,6 @@ class MainWindow(QMainWindow):
         self.add_operations_from_namespace(c_oper, self.ui.core_operations_list)
         self.add_operations_from_namespace(s_oper, self.ui.special_operations_list)
 
-
     def print_input_port_1(self):
         print("Input port 1")
 
diff --git a/b_asic/GUI/utils.py b/b_asic/GUI/utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..721496c7db7d0259d6335681f6a4c95c6c5930b6
--- /dev/null
+++ b/b_asic/GUI/utils.py
@@ -0,0 +1,19 @@
+from PyQt5.QtWidgets import QErrorMessage
+from traceback import format_exc
+
+def handle_error(fn):
+    def wrapper(self, *args, **kwargs):
+        try:
+            return fn(self, *args, **kwargs)
+        except Exception as e:
+            QErrorMessage(self._window).showMessage(f"Unexpected error: {format_exc()}")
+
+    return wrapper
+
+def decorate_class(decorator):
+    def decorate(cls):
+        for attr in cls.__dict__:
+            if callable(getattr(cls, attr)):
+                setattr(cls, attr, decorator(getattr(cls, attr)))
+        return cls
+    return decorate
\ No newline at end of file