diff --git a/designer-base/src/main/java/com/fr/common/exception/ThrowableHandler.java b/designer-base/src/main/java/com/fr/common/exception/ThrowableHandler.java
new file mode 100644
index 0000000000..225d90e791
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/common/exception/ThrowableHandler.java
@@ -0,0 +1,12 @@
+package com.fr.common.exception;
+
+/**
+ * @author hades
+ * @version 10.0
+ * Created by hades on 2021/12/27
+ */
+public interface ThrowableHandler {
+
+    boolean process(Throwable e);
+
+}
diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java
index f1f72b48c0..3e6ec08197 100644
--- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java
+++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java
@@ -50,6 +50,7 @@ import com.fr.design.ui.util.UIUtil;
 import com.fr.design.utils.DesignUtils;
 import com.fr.design.worker.save.CallbackSaveWorker;
 import com.fr.design.worker.save.EmptyCallBackSaveWorker;
+import com.fr.design.worker.save.SaveFailureHandler;
 import com.fr.design.write.submit.DBManipulationInWidgetEventPane;
 import com.fr.design.write.submit.DBManipulationPane;
 import com.fr.event.EventDispatcher;
@@ -882,7 +883,7 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
             export();
         } catch (Exception e) {
             FineLoggerFactory.getLogger().error(e.getMessage(), e);
-            JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), e.getMessage(), "Save Error", JOptionPane.ERROR_MESSAGE);
+            SaveFailureHandler.getInstance().process(e);
             return false;
         }
         this.editingFILE = editingFILE;
diff --git a/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java b/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java
new file mode 100644
index 0000000000..31c622ab3a
--- /dev/null
+++ b/designer-base/src/main/java/com/fr/design/worker/save/SaveFailureHandler.java
@@ -0,0 +1,70 @@
+package com.fr.design.worker.save;
+
+import com.fr.common.exception.ThrowableHandler;
+import com.fr.design.dialog.FineJOptionPane;
+import com.fr.design.i18n.Toolkit;
+import com.fr.design.mainframe.DesignerContext;
+import com.fr.general.IOUtils;
+import com.fr.workspace.exception.DiskSpaceFullException;
+import java.awt.Frame;
+import javax.swing.JOptionPane;
+
+/**
+ * @author hades
+ * @version 10.0
+ * Created by hades on 2021/12/7
+ */
+public class SaveFailureHandler implements ThrowableHandler {
+
+    private static final SaveFailureHandler INSTANCE = new SaveFailureHandler();
+
+    public static SaveFailureHandler getInstance() {
+        return INSTANCE;
+    }
+
+    @Override
+    public boolean process(Throwable e) {
+        for (Handler handler : Handler.values()) {
+            if (handler.process(e)) {
+                break;
+            }
+        }
+        return true;
+    }
+
+    public enum Handler implements ThrowableHandler {
+
+        FullDisk {
+            @Override
+            public boolean process(Throwable e) {
+                if (e.getCause() instanceof DiskSpaceFullException
+                        || e instanceof DiskSpaceFullException
+                        || e.getCause().getCause() instanceof DiskSpaceFullException) {
+                    FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(),
+                                                      Toolkit.i18nText("Fine_Design_Template_Save_Failed_By_Full_Disk"),
+                                                      Toolkit.i18nText("Fine-Design_Basic_Alert"),
+                                                      JOptionPane.WARNING_MESSAGE,
+                                                      IOUtils.readIcon("/com/fr/design/images/warnings/warning32.png"));
+                    return true;
+                }
+                return false;
+            }
+        },
+
+        Other {
+            @Override
+            public boolean process(Throwable e) {
+                boolean minimized = (DesignerContext.getDesignerFrame().getExtendedState() & Frame.ICONIFIED ) != 0;
+                FineJOptionPane.showMessageDialog(
+                        minimized ? null : DesignerContext.getDesignerFrame(),
+                        Toolkit.i18nText("Fine-Design-Basic_Save_Failure"),
+                        Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"),
+                        JOptionPane.ERROR_MESSAGE);
+                return true;
+            }
+        };
+
+
+
+    }
+}
\ No newline at end of file
diff --git a/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java
index f47a4f88e7..c7a962c259 100644
--- a/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java
+++ b/designer-base/src/main/java/com/fr/design/worker/save/SaveWorker.java
@@ -55,12 +55,7 @@ public class SaveWorker extends SwingWorker<Boolean, Void> {
         } catch (Exception e) {
             processResult();
             FineLoggerFactory.getLogger().error(e.getMessage(), e);
-            boolean minimized = (DesignerContext.getDesignerFrame().getExtendedState() & Frame.ICONIFIED ) != 0;
-            FineJOptionPane.showMessageDialog(
-                    minimized ? null : DesignerContext.getDesignerFrame(),
-                    Toolkit.i18nText("Fine-Design-Basic_Save_Failure"),
-                    com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"),
-                    JOptionPane.ERROR_MESSAGE);
+            SaveFailureHandler.getInstance().process(e);
             return;
         }
         processResult();