Right. I know attachments get trashed sometimes so hopefully this hacked up code in-lines correctly:
===================================== private Exception formatThrown; private volatile Handler lastHandler; private void reportError(Handler h, Exception ex) { if (h == null) { h = this.lastHandler; } if (h != null) { this.lastHandler = h; if (ex == null) { ex = set(null); } if (ex != null) { h.reportError(null, ex, ErrorManager.FORMAT_FAILURE); } } else { if (ex != null) { set(ex); } } } private synchronized Exception set(Exception e) { Exception l = this.formatThrown; this.formatThrown = e; return l; } ========================================== Then in the formatter.getHead/getTail call reportError(h, null) and in formatMessage call reportError(null, ex). This example can be improved by clearing the handler/exception in getTail and avoid some redundant volatile stores but you get the idea. Jason ________________________________________ From: Daniel Fuchs <daniel.fu...@oracle.com> Sent: Friday, November 20, 2015 11:04 AM To: Jason Mehrens; Alexander Fomin; core-libs-dev@openjdk.java.net; mandy.ch...@oracle.com Subject: Re: JDK 9 RFR [8137005]: java.util.logging.Formatter#formatMessage() swallows Exceptions On 20/11/15 17:55, Jason Mehrens wrote: > Hi Daniel, > > Well I'm sure the authors of the unit tests wrote code that never leaks the > handlers they have created right? :) > > If urgency or frequency of the reporting is required then capture the handler > in getHead as formatter state. The write code to report the exception under > all possible states: > 1. if exception present and getHead is called then report it to non null > Handler and clear (JDK-6351685). oh - I see. I hadn't thought of that. That's actually a very good suggestion. So the Formatter could access the Handler's ErrorManager and if that's not null it could call handler.errorManager.error(...) That's what you are suggesting - right? best regards, -- daniel > 2. if exception happens during format and we have a handler captured from > getHead then report otherwise store it. > 3. if exception is present during getTail then report it to a non null > Handler and clear the exception and hander. > > That means you'll have to add super.getHead and super.getTail calls in > XMLFormatter too. > > I'm really leaning towards removing this try/catch > (https://blogs.oracle.com/darcy/entry/kinds_of_compatibility). Handlers > already expect that Formatter.format->formattMessage will fail. After all if > they didn't fail we wouldn't have specified ErrorManager.FORMAT_FAILURE. > Take a look at StreamHandler.publish. Or the handler implementation goes in > the opposite direction and makes the publish method exception hostile which > is already a violation of the spec. > > It pains me to say it but, as long as you don't break the SLF4J bridge > handler then you have covered most of the JUL users. > > Jason > > > ________________________________________ > From: Daniel Fuchs <daniel.fu...@oracle.com> > Sent: Friday, November 20, 2015 9:32 AM > To: Jason Mehrens; Alexander Fomin; core-libs-dev@openjdk.java.net; > mandy.ch...@oracle.com > Subject: Re: JDK 9 RFR [8137005]: java.util.logging.Formatter#formatMessage() > swallows Exceptions > > On 20/11/15 15:47, Jason Mehrens wrote: >> Alexander, >> >> Why not just cache the last exception in the formatter and use getTail to >> clear it and report it? Since formatter is in the same package as Handler >> you will have elevated access to the error manager through >> Handler.reportError. That also makes it so you don't have to change the >> public API of Formatter. > > Hi Jason, > > That would mean that you won't see the exception until > the handler is closed. Not sure whether that matters much. > ErrorManager looks already bizarre to me. But at least > with ErrorManager it looks as if someone who cares could > set his/her own ErrorManager on the formatter (with hopefully > a more sensible implementation). > > I have no specific opinion on the subject I'm in favor > of taking the solution that is the least likely to cause > compatibility issues :-) > > best regards, > > -- daniel > >> >> Jason >> >> ________________________________________ >> From: core-libs-dev <core-libs-dev-boun...@openjdk.java.net> on behalf of >> Alexander Fomin <alexander.fo...@oracle.com> >> Sent: Friday, November 20, 2015 7:48 AM >> To: core-libs-dev@openjdk.java.net; Daniel Fuchs; mandy.ch...@oracle.com >> Subject: JDK 9 RFR [8137005]: java.util.logging.Formatter#formatMessage() >> swallows Exceptions >> >> Hi, >> please, review this patch to report errors in >> java.util.logging.Formatter#formatMessage(). >> >> Bug: https://bugs.openjdk.java.net/browse/JDK-8137005 >> Webrev: http://cr.openjdk.java.net/~dfuchs/alexander/8137005/webrev.00 >> >> Summary: >> j.u.logging.Formatter#formatMessage() swallows exceptions that >> happening during formatting of a message. In the result the exceptions >> are lost and users don't know about reasons why the message hasn't been >> formatted as expected. We would avoid to throw any exceptions in >> Formatter#formatMessage() from compatibility stand point. To report an >> error in consistent way we have to pass ErrorManager in Formatter. It's >> require API changes. So, I'm going to file CCC when if the fix approved. >> The suggested fix is to add 2 new methods in j.u.logging.Formatter >> to set/get an ErrorManager, update Formatter#formatMessage() to report >> errors via the ErrorManager and update Handler to pass errorManager to >> Formatter. >> >> Testing: >> A couple of new regression tests have been created: >> test/java/util/logging/Test8137005.java - real case provided by >> users >> test/java/util/logging/NullErrorManagerTest.java - additional >> check to make sure no NPE showed if ErrorManager isn't set. Beside of >> this touched new API methods. >> >> Logging regression tests have been run: >> jdk/test/java/util/logging >> jdk/test/closed/java/util/logging >> jdk/test/sun/util/logging >> All tests passed passed. >> >> JPRT: >> http://sthjprt.uk.oracle.com/archives/2015/11/2015-11-19-143523.gtee.dev/ >> failures in the job are known issues and not related to the fix. >> >> Thanks, >> Alexander >> >> >> >