diff --git a/eo-runtime/src/main/java/org/eolang/PhSafe.java b/eo-runtime/src/main/java/org/eolang/PhSafe.java index 415b859820..db1329bab4 100644 --- a/eo-runtime/src/main/java/org/eolang/PhSafe.java +++ b/eo-runtime/src/main/java/org/eolang/PhSafe.java @@ -174,6 +174,11 @@ private T through(final Action action) { /** * Helper, for other methods. + * + *

No matter what happens inside the {@code action}, only + * an instance of {@link EOerror.ExError} may be thrown out + * of this method.

+ * * @param action The action * @param suffix The suffix to add to the label * @param Type of result @@ -186,11 +191,27 @@ private T through(final Action action, final String suffix) { return action.act(); } catch (final EOerror.ExError ex) { throw new EOerror.ExError(ex, this.label(suffix)); - } catch (final RuntimeException | Error ex) { + } catch (final ExAbstract ex) { throw new EOerror.ExError( new Data.ToPhi(ex.getMessage()), this.label(suffix) ); + } catch (final RuntimeException | Error ex) { + final StringBuilder msg = new StringBuilder(0); + final StackTraceElement[] stack = ex.getStackTrace(); + if (stack != null && stack.length > 0) { + final StackTraceElement last = stack[0]; + msg.append(last.getFileName()).append(':') + .append(last.getLineNumber()).append(':') + .append(' '); + } + msg.append(ex.getClass().getSimpleName()) + .append(": ") + .append(ex.getMessage()); + throw new EOerror.ExError( + new Data.ToPhi(msg.toString()), + this.label(suffix) + ); } } diff --git a/eo-runtime/src/test/java/org/eolang/PhSafeTest.java b/eo-runtime/src/test/java/org/eolang/PhSafeTest.java index 5712b09715..e8360630c4 100644 --- a/eo-runtime/src/test/java/org/eolang/PhSafeTest.java +++ b/eo-runtime/src/test/java/org/eolang/PhSafeTest.java @@ -107,7 +107,11 @@ public Phi take(final String name) { "throws correct class" ).enclosure() ).take(String.class), - Matchers.equalTo("intentional error") + Matchers.allOf( + Matchers.startsWith("PhSafeTest.java:"), + Matchers.containsString("IllegalArgumentException"), + Matchers.containsString("intentional error") + ) ); }