From fb29e43cd9e8a6987ec267c244577ce82050aa4f Mon Sep 17 00:00:00 2001 From: sttk Date: Thu, 9 Apr 2026 23:48:27 +0900 Subject: [PATCH] fix: refined error handling --- src/main/java/com/github/sttk/sabi/AsyncGroup.java | 3 +++ src/main/java/com/github/sttk/sabi/DataHub.java | 12 ++++++++++-- .../github/sttk/sabi/internal/AsyncGroupImpl.java | 7 ++++--- .../com/github/sttk/sabi/internal/DataHubInner.java | 4 ++-- .../com/github/sttk/sabi/internal/DataSrcList.java | 4 ++++ 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/github/sttk/sabi/AsyncGroup.java b/src/main/java/com/github/sttk/sabi/AsyncGroup.java index 1a56b87..46f266e 100644 --- a/src/main/java/com/github/sttk/sabi/AsyncGroup.java +++ b/src/main/java/com/github/sttk/sabi/AsyncGroup.java @@ -28,6 +28,9 @@ record RunnerFailed() {} */ record RunnerInterrupted() {} + /** Represents an unexpected {@link RuntimeException} that occurred. */ + record RuntimeExceptionOccurred() {} + /** * Adds a {@link Runner} to this group for asynchronous execution. The added runner will be * executed in a separate thread. diff --git a/src/main/java/com/github/sttk/sabi/DataHub.java b/src/main/java/com/github/sttk/sabi/DataHub.java index 291384d..e3f6908 100644 --- a/src/main/java/com/github/sttk/sabi/DataHub.java +++ b/src/main/java/com/github/sttk/sabi/DataHub.java @@ -193,8 +193,10 @@ public void run(Logic logic) throws Err { try { this.begin(); logic.run(data); - } catch (Err | RuntimeException e) { + } catch (Err e) { throw e; + } catch (RuntimeException e) { + throw new Err(new RuntimeExceptionOccurred(), e); } finally { this.end(); } @@ -226,7 +228,13 @@ public void txn(Logic logic) throws Err { this.begin(); logic.run(data); this.commit(); - } catch (Err | RuntimeException | Error e) { + } catch (Err e) { + this.rollback(); + throw e; + } catch (RuntimeException e) { + this.rollback(); + throw new Err(new RuntimeExceptionOccurred(), e); + } catch (Error e) { this.rollback(); throw e; } finally { diff --git a/src/main/java/com/github/sttk/sabi/internal/AsyncGroupImpl.java b/src/main/java/com/github/sttk/sabi/internal/AsyncGroupImpl.java index e0be842..10fa9a3 100644 --- a/src/main/java/com/github/sttk/sabi/internal/AsyncGroupImpl.java +++ b/src/main/java/com/github/sttk/sabi/internal/AsyncGroupImpl.java @@ -27,8 +27,10 @@ public void add(final Runner runner) { () -> { try { runner.run(); - } catch (Err | RuntimeException e) { + } catch (Err e) { addErr(name, e); + } catch (RuntimeException e) { + addErr(name, new Err(new AsyncGroup.RuntimeExceptionOccurred(), e)); } }); @@ -42,8 +44,7 @@ public void add(final Runner runner) { } } - synchronized void addErr(String name, Exception e) { - var err = (e instanceof Err) ? Err.class.cast(e) : new Err(new RunnerFailed(), e); + synchronized void addErr(String name, Err err) { var ent = new ErrEntry(name, err); if (this.errLast == null) { diff --git a/src/main/java/com/github/sttk/sabi/internal/DataHubInner.java b/src/main/java/com/github/sttk/sabi/internal/DataHubInner.java index 6d1063b..6fea032 100644 --- a/src/main/java/com/github/sttk/sabi/internal/DataHubInner.java +++ b/src/main/java/com/github/sttk/sabi/internal/DataHubInner.java @@ -190,8 +190,8 @@ public C getDataConn(String name, Class cls) throws Err DataConn conn; try { conn = dsPtr.ds.createDataConn(); - } catch (Err | RuntimeException e) { - throw new Err(new DataHub.FailToCreateDataConn(name, cls.getName())); + } catch (Exception e) { + throw new Err(new DataHub.FailToCreateDataConn(name, cls.getName()), e); } if (conn == null) { throw new Err(new DataHub.CreatedDataConnIsNull(name, cls.getName())); diff --git a/src/main/java/com/github/sttk/sabi/internal/DataSrcList.java b/src/main/java/com/github/sttk/sabi/internal/DataSrcList.java index e8109ef..99ebc81 100644 --- a/src/main/java/com/github/sttk/sabi/internal/DataSrcList.java +++ b/src/main/java/com/github/sttk/sabi/internal/DataSrcList.java @@ -5,6 +5,7 @@ package com.github.sttk.sabi.internal; import com.github.sttk.errs.Err; +import com.github.sttk.sabi.DataHub; import com.github.sttk.sabi.DataSrc; import java.util.HashMap; import java.util.Map; @@ -139,6 +140,9 @@ Map setupDataSrcs() { } catch (Err err) { errMap.put(ptr.name, err); break; + } catch (RuntimeException e) { + errMap.put(ptr.name, new Err(new DataHub.RuntimeExceptionOccurred(), e)); + break; } ptr = ptr.next; }