Possible "throws" syntax

Marco Leise Marco.Leise at gmx.de
Fri Aug 17 00:47:32 PDT 2012


Am Wed, 15 Aug 2012 23:29:43 +0400
schrieb Dmitry Olshansky <dmitry.olsh at gmail.com>:

> When I see code like this I have one single thought - error codes!
> 
> Indeed that's what is used in this example, with Exceptions only being 
> convenient (and separate) transport for error codes. So the net progress 
> is creating 1:1 type for each error condition (start counting the lines 
> of code) and then...
> 
> If I got it right somewhere later foo is supposed to be used like this:
> try{
> ...some_code
> foo();
> ...other code
> }
> catch(UnexpectedResponseException)
> {
> 	print error and disconnect this server or retry?
> }
> catch(UnauthenticatedException)
> {
> 	print error 2
> }
> catch(SecurityException)
> {
> 	sslFoo(resp); // this one is just awesome ;)
> }
> catch(DisconnectException )
> {
> 	print error 3 & (ask to) reconnect?
> }
> 
> Or used a catch all and do type switch Java-style to see if Exception is 
> one of interesting to you types.  Needless to say awful again.
> 
> First SecurityError is gross fiction as you either know to authenticate 
> (need credentials in the interface) or do auto detection (like try 
> HTTPS, then fallback to HTTP).
> 
> Moreover encoding _cause_ of error in type is useless, end user needs a 
> hint on the proper way to handle error. It's like pointing out a guy who 
> made the mistake and how stupid it is instead of proposing the ways to 
> fix the situation.
> 
> what I'd expect the code to be is (been discussed before):
> class NetworkException
> {
> 	@property bool transient; // packet lost or whatever, can re-try with 
> the same parameters
> 	@property bool lost; // need reconnect to restore, server down or 
> disconnected or unexpected input
> 	@property string msg();
> }
> 
> This reduces all the handling to:
> catch(NetworkException ne)
> {
> 	if(ne.lost)
> 		//ya kill me, but you got the idea ;)
> 		goto ReconnectAndRetry;
> 	if(ne.transient){
> 		warning("..."); //log failure
> 		goto RetryAndCheckTryCount;
> 	}
> 	error(ne.msg);
> }
> 
> Including but not limited to the time when foo's author adds more types 
> to his "throws list". Unlike checked exceptions it won't break build 
> just for the fuck of it *and* it will still work correctly.
> 
> In fact if we manage to come up with proper reasonable standard 
> exceptions like Network/IO/etc. that everybody derives from error 
> handling would become damn easy with *any* library.

Just for the fuck of it, huh :) ? Interesting read, do you know an example, probably a standard library of some other language, that offers standard exceptions like this? If I understand you correctly, the idea is to not use distinct error ids (be they codes or exception classes), but a mix of flags. So you'd have pretty much one "catch" with a few "if"s, but with the flags you can decide on the granularity.

-- 
Marco



More information about the Digitalmars-d mailing list