On Tue, 3 Jan 2023 13:57:20 GMT, Matthias Baesken <mbaes...@openjdk.org> wrote:
>> We have a couple of places where a SocketException is thrown but the cause >> is omitted. It would be beneficial for example in error analysis not to >> throw away the cause (causing exception) but to add it to the created >> SocketException. > > Matthias Baesken has updated the pull request incrementally with one > additional commit since the last revision: > > Adjust Socket createImpl again The changes in [8af8a34d] to Socket, ServerSocket and SocksSocketImpl looks okay. I think the changes to NioSocketImpl will lead to confusing output as the cause will be almost identify to the SocketException. I assume your goal with the change is to get the deepest implementation frames into the stack trace. They would be there if read/write threw IOException but we decided in JEP 353 to throw the more specific SocketException to maintain historical behavior. So maybe we could try this instead - this will throw the SocketException with the stack trace from the IOException so it will include the deepest frames: diff --git a/src/java.base/share/classes/sun/nio/ch/NioSocketImpl.java b/src/java.base/share/classes/sun/nio/ch/NioSocketImpl.java index b2531135b03..f96d8380f29 100644 --- a/src/java.base/share/classes/sun/nio/ch/NioSocketImpl.java +++ b/src/java.base/share/classes/sun/nio/ch/NioSocketImpl.java @@ -312,7 +312,8 @@ public final class NioSocketImpl extends SocketImpl implements PlatformSocketImp connectionReset = true; throw new SocketException("Connection reset"); } catch (IOException ioe) { - throw new SocketException(ioe.getMessage()); + // throw SocketException to maintain compatibility + throw asSocketException(ioe); } finally { endRead(n > 0); } @@ -410,7 +411,8 @@ public final class NioSocketImpl extends SocketImpl implements PlatformSocketImp } catch (InterruptedIOException e) { throw e; } catch (IOException ioe) { - throw new SocketException(ioe.getMessage()); + // throw SocketException to maintain compatibility + throw asSocketException(ioe); } finally { endWrite(n > 0); } @@ -1081,10 +1083,8 @@ public final class NioSocketImpl extends SocketImpl implements PlatformSocketImp default: throw new SocketException("Unknown option " + opt); } - } catch (SocketException e) { - throw e; } catch (IllegalArgumentException | IOException e) { - throw new SocketException(e.getMessage()); + throw asSocketException(e); } } } @@ -1133,10 +1133,8 @@ public final class NioSocketImpl extends SocketImpl implements PlatformSocketImp default: throw new SocketException("Unknown option " + opt); } - } catch (SocketException e) { - throw e; } catch (IllegalArgumentException | IOException e) { - throw new SocketException(e.getMessage()); + throw asSocketException(e); } } } @@ -1249,6 +1247,19 @@ public final class NioSocketImpl extends SocketImpl implements PlatformSocketImp return remainingNanos; } + /** + * Creates a SocketException from the given exception. + */ + private static SocketException asSocketException(Exception e) { + if (e instanceof SocketException se) { + return se; + } else { + var se = new SocketException(e.getMessage()); + se.setStackTrace(e.getStackTrace()); + return se; + } + } + /** * Returns the socket protocol family. */ ------------- PR: https://git.openjdk.org/jdk/pull/11813