Java also has chained exceptions, done manually

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Sun Sep 9 01:09:24 UTC 2018


On 9/7/18 7:15 PM, Tobias Mueller wrote:
> On Thursday, 6 September 2018 at 14:39:12 UTC, Andrei Alexandrescu wrote:
>> Second, it does pay to keep abreast other languages. I had no idea 
>> (and am quite ashamed of it) that Java also has chained exceptions:
>>
>> https://www.geeksforgeeks.org/chained-exceptions-java/
> 
> Now I'm surprised... is there a language (except C++) that supports 
> exceptions that does _not_ have it?
> Java: getCause()
> C#: InnerException
> PHP: getPrevious()
> ...

David Nadlinger wrote that Python also has them.

> I think chained exception in D is semantically very different from other 
> languages like Java.
> 
> In languages like Java or C# the exception chain has nothing to do with 
> saving exceptions that are thrown in finally blocks.
> Instead the chain is used for a layer model. The "outer" exception is 
> the higher level exception and the "inner" exception is the lower level 
> cause of the higher level exception.
> 
> Often a low level exception is quite meaningless when thrown over 
> multiple levels in the call stack.
> For example, imagine a program that uses a configuration file. While 
> parsing the configuration, a misformatted number is encountered.
> If the NumberFormatException is propagated to the top level, it is 
> basically useless for programmatic error handling.
> This is much better:
> ConfigurationException -> JsonParsingException -> NumberFormatException
> 
> The higher level exceptions are therefore directly caused by the lower 
> level exception and always thrown _directly_ in the catch block where 
> the lower level exception is catched and readily available. Not in a 
> finally block and not indirectly in a function called from the catch block.
> Manually passing the inner exception to the constructor of the outer 
> exception is trivial and IMO the right thing, because it's probably not 
> always wanted.
> 
> Now in D, chained exceptions work differently.
> The first exception that is thrown is deemed the "important" exception 
> and later exceptions are simply chained to it. A direct semantic 
> connection between the exceptions is not possible at all, since the 
> later exception has no knowledge about the first exception at all.
> It also means that the order of the exceptions is reversed. The first 
> exception is the "outer" exception which is the exact opposite of how it 
> is meant in Java.
> 
> When handling an exception, it's not clear at all what those additional 
> exceptions mean and how they should be handled.
> 
> Personally I find the Java/C# model much more useful.

Well indeed the upper you are on the stack, the more likely you are in a 
high-level function. It's a good heuristic. Sadly we cannot change 
chaining semantics now, but it does stand to reason to print the last 
exception in a chain, instead of the head, as the most relevant cause. 
Guess we'd do good to have such functionality in the stdlib.


Andrei




More information about the Digitalmars-d mailing list