> On 17 Jan 2017, at 11:28, Alex Blewitt <alb...@apple.com> wrote:
> 
> 
>> On 17 Jan 2017, at 11:10, Jeremy Pereira via swift-evolution 
>> <swift-evolution@swift.org> wrote:
>> 
>> 
>>> On 17 Jan 2017, at 02:38, thislooksfun via swift-evolution 
>>> <swift-evolution@swift.org> wrote:
>>> 
>>> I really hate to bring Java up, but I really do think it got at least one 
>>> thing right with its error system, namely that one subset of error (namely 
>>> `RuntimeException`), wouldn't be enforced by the compiler, but could 
>>> optionally be caught.
>> 
>> I don’t entirely agree for two reasons:
>> 
>> 1. If a runtime error is thrown and caught, there is no way to guarantee the 
>> logical consistency of the state of the running process because who knows 
>> which stack frames were unwound without cleaning up properly. There is no 
>> way to safely catch a run time exception and recover.
> 
> From a Java perspective, clearly that's not true. 

It absolutely is true. 

     int someMethod()
     {
         aquireSomeLock();
         doSomethingThatIsNotDeclaredToThrowAnException();
         releaseSomeLock();
     }


> 
> It may well be true for the current implementation of Swift, and there's 
> questions about how to clean up objects with reference counts outstanding 
> (since there's no garbage collector). It isn't necessarily the case that it 
> isn't possible, but it does require some additional stack unwinding; and the 
> implementation of that may be too cumbersome/impractical/undesirable to occur.

Not all resources are reference counts or memory allocations.

> 
>> 2. People abuse RuntimeException to simplify their error handling code: “if 
>> I throw a RuntimeException I don’t need a zillion catch clauses or throws 
>> declarations”. Furthermore, if a library uses RuntimeExceptions where it 
>> should be using Exceptions there is no way to know if its API has changed 
>> except by reading the (hopefully up to date) documentation.
>> 
>> Problem 2 makes me particularly bitter because JEE programmers seem to have 
>> learned that allowing code to throw null pointer exceptions has no real 
>> consequences for them  so they become very cavalier about doing their null 
>> checks. The user sees an 500 error page, the sys admin gets a 200 line stack 
>> trace in the log, but the system carries on. If you are lucky enough to have 
>> the source code to diagnose the problem, it usually turns out that the 
>> exception was thrown on a line with eight chained method calls. When you do 
>> track the problem down, it turns out you forgot a line in the properties 
>> file or something similar but the programmer couldn’t be bothered to help 
>> you out because it was easier just to let the null pointer exception happen.
> 
> That's a pretty poor example, and in any case, the individual cause would 
> allow the system to continue on processing subsequent requests, which is 
> generally what's wanted. When you're working on large systems and with large 
> data sets, there are generally always problematic items like this which have 
> to be diagnosed sufficiently in order to be retried, or even handled 
> manually. It has very little to do with the language and more to do with the 
> quality of data which isn't something you always have control over.

No it’s not a poor example. I’ve seen it happen with real software in real 
production scenarios.

> 
>> I like Swift’s error handling because programming errors (like force 
>> unwrapping nil) are punished mercilessly by process termination and errors 
>> caused by external factors cannot be completely ignored. You have to at 
>> least put an empty catch block somewhere.
> 
> This is one of the significant problems in Swift at the moment for 
> server-side logic. It may make sense to do this from a single-user 
> application, but writing a server which is designed to handle hundreds or 
> thousands of simultaneous clients can suffer from the fact that one bad 
> client request can take out everyone's connection. In the server working 
> group and in existing tools like Kitura/Vapor/Perfect etc. it's a non-trivial 
> problem to solve, other than using a CGI like model where each request is 
> handled by a single worker process that can terminate independently of the 
> other requests in flight.

I agree it’s a non trivial problem to resolve. I’m saying that the Java 
“solution” of RuntimeExceptions doesn’t resolve it. 

> 
> Alex

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to