The 'ignoreslist' exception handling proposal.

Rémi Forax forax at univ-mlv.fr
Wed May 20 08:02:46 PDT 2009


Reiner, the problem is not new String(byte, Charset) but
the fact that Charset.forName() doesn't use a checked exception.

The philosophy behind exception is:
- If it's a developer mistake, it's a runtime exception
- If it's an error that comes form outside the Java platform,
  i.e an error that can not be predicted without some elements from outside
  the Java platform,  it's a checked exception.

Depending on the installation, some Charsets are available or not,
this is clearly an error that comes form outside of Java world so
it should be handled with a checked exception.

Ok, it's a mistake
but I don't understand  how  it's related to your proposal ?

Rémi

Reinier Zwitserloot a écrit :
> I'm more convinced than ever that java really needs this change,  
> sooner rather than later.
>
> My arguments in favour:
>
>   1. Ruslan totally misunderstood my proposal, and also appears to  
> misunderstand checked exceptions on the JVM level in general. This is  
> in my experience an extremely common problem amongst java programmers,  
> and this is very bad news for trying to interop javac-produced class  
> files with scalac, groovy, JRuby, Python, and other languages' class  
> files. By adding the concept of sneakyThrow to java, we teach java  
> programmers that checked exceptions are only a debugging aid offered  
> by javac, and NOT a guarantee by the JVM. This isn't a philosophical  
> change at all: It's realism. In today's JVM world, you just cannot  
> rely on that as a java programmer, and yet most java programmers do.
>
>   NB: Ruslan and everyone else that's confused - I'll send an  
> explanatory email in a few minutes to explain how it all works.
>
>   2. Joe Darcy, project coin, and sun routinely defend choices for the  
> java platform by stating that java is designed for the realistic,  
> human (e.g. fallible) programmer. We defend not adding operator  
> overloading by stating that people will abuse it (FWIW, I agree with  
> this mentality). And yet java (the language, not the VM!)'s current  
> method of handling checked exceptions is geared towards the mythical  
> perfectionist programmer! That makes no sense at all. I'll back up  
> this point:
>
>
>   #1: The JVM cannot, and does not, guarantee that the exceptions that  
> fall out of a method call are only Errors, RuntimeExceptions, and any  
> exception types declared by that method. That's simply not how the JVM  
> works, and yet most java programmers erroneously think that it is.  
> Being realistic for a moment, sneakyThrows occur all the time; you can  
> have a class file mismatch (compiled against a different version of  
> the class file vs. the version of that class file at runtime), you can  
> be using a class compiled by scala, groovy, JRuby, Jython, or any  
> other non-java programming language, or someone used a sneakyThrow  
> method.
>
> Realistically, then, this isnt a philosophical change at all. We're  
> just acknowledging something that already happened.
>
>   #2: People get exception hierarchies wrong. All the time. The new  
> String(bytes, encoding) constructor is flawed, for example. The right  
> solution would be to have a Charset class and appropriate constructor  
> that uses it (which string now has, since java 1.6, but the point to  
> take home here is that the java core team it self, with all the  
> lessons they knew by the time java 1.5 was developed, and with all  
> that reviewed, still screwed it up), and preferably also a  
> Charset.UTF8 constant, which java still doesn't have. Right now we  
> have the weird situation that new String(bytes, "foo"); throws a  
> checked exception, but new String(bytes, Charset.forName("foo")),  
> which seems semantically equivalent, throws an unchecked exception.  
> That cannot be the right design; we have it today because of the need  
> for backwards compatibility. We must acknowledge that java's exception  
> handling isn't perfect.
>
> There isn't even a proper definition of what constitutes a good  
> situation for a checked exception, and what doesn't. Some people say  
> that checked exceptions are appropriate only for legitimate  
> alternative return values, where it would be a clear bug if a caller  
> doesn't handle this code, in virtually all imaginable scenarios, such  
> as an InsufficientBalanceException for a banking app's  
> transferFundsFromPersonToPerson(Person A, Person B) method. In this  
> view, IOException is mistyped (because there are whole hosts of  
> situations where IOExceptions are either extremely unlikely, or  
> likely, but there's nothing you can do - it is truly a program error  
> and not an alternative return scenario; the only viable action is  
> quitting, which an unchecked exception can do just as well). Then  
> there's the view that a checked exception is appropriate anytime an  
> exception is remotely likely to occur. In this view, Integer's  
> parseInt's NumberFormatException is misclassed, because obviously non- 
> numeric input is likely, and yet NFEx is unchecked.
>
> There is, in fact, no philosophy about checked and unchecked  
> exceptions that would classify the various exceptions in the java core  
> libraries the way they are in real life. It's a grab bag; some are  
> checked, some are unchecked, and there's only a vague philosophy  
> behind the choices.
>
> InputStream.close() throws a checked exception which most programmers  
> find very questionable. Almost certainly a mistake, in practice (even  
> if in theory it makes sense and is nicely symmetric with  
> OutputStream's close, which does entirely appropriately throw  
> IOException - at least as appopriate as write()'s throws clause).
>
> Proper use of the new String(bytes, encoding) constructor (where the  
> input encoding is actually a variable and not a string literal) throws  
> a checked exception, but Integer.parseInt() doesn't. yet, both are  
> trying to parse a string where some forms are legal and some forms  
> aren't. There's no reason for the dichotomy here; it's random.
>
> SQLException has only recently seen some work to make it a more usable  
> construct, though the current situation amongst JDBC drivers remains  
> troublesome. There are also many many mistakes that the entire  
> exception hierarchy concept can make happen. Fine case in point:
>
> new String(bytes, "UUTF-8"); throws an UnsupportedEncodingException,  
> which is a subclass of IOException. What, exactly, does this error  
> have to do with I/O? Nothing whatsoever. The idea that  
> UnsupportedEncodingException is a subclass of IOException is very  
> questionable.
>
> We can also look at the other extreme and complain about the insane  
> amount of exceptions that can fall out of reflection related calls.
>
> Bottomline: Let's be realistic - exception handling in java isn't  
> perfect, and it never will be. Trying to protect people from abusing  
> the throwing of exceptions by forcing rigid checked exception handling  
> is a failed experiment, and the fact that just about every JVM  
> language other than java itself doesn't have checked exceptions at all  
> means we need a way to explicitly say to javac: I know better than you  
> do, in this instance. Realistically, the number of situations where  
> javac's advice is just wrong is formidable, and its making us write  
> bad code.
>
>
> Mark, your proposal does indeed attempt to deal with this issue in a  
> less philosophically drastic fashion, but I think the end result just  
> isn't as good. Consider again Ruslan's typoed UUTF-8 example:
>
> If we wrap it, we're just hiding the cause behind a generic  
> InternalError, AssertionError, or RuntimeException. I've seen them  
> all. There's actually a decent unchecked alternative available  
> (UnsupportedEncodingError) but that's the exception (heh, heh) rather  
> than the rule. Sure, there's getCause(), but 'cause hell' is already  
> causing stack traces nearing a hundred pages long, and a continuing  
> unsolved problem in java land is finding the one cause in the massive  
> onslaught that helps you get to real issue at hand. In this situation,  
> the rewrap is needless noise in the exception chain.
>
> Without either your or my proposal, we get the worst of both worlds:  
> We rethrow, adding noise to the runtime information, and we also add 4  
> to 5 lines of noise to the code with a semantically pointless try/ 
> catch block that rethrows the UnsupportedEncodingEx into something else.
>
>   --Reinier Zwitserloot
> Like it? Tip it!
> http://tipit.to
>
>
>
>
>   




More information about the coin-dev mailing list