MOTIVATION:

In Swift 3, NSTask was renamed to Process, making it the de facto API for 
spawning external tasks in Swift applications. Unfortunately, NSTask uses 
Objective-C exceptions to report runtime errors in spawning external tasks, 
which cannot be caught from Swift code. This means that if something goes 
wrong, like the file unexpectedly not existing at the launch path, or the 
current user not having permission to launch it or something, there’s no way to 
handle that gracefully other than crashing the whole program.

PROPOSED SOLUTION:

Rename Process back to NSTask, and provide a Swift-native Process class for 
Foundation in Swift 4 that mimics NSTask's interface, but provides a throwing 
version of the ‘launch’ method:

open class Process {
    // ...
    
    open func launch() throws

    // ...
}

Almost all of the work for this is already done in the 
swift-corelibs-Foundation project. The only NSUnimplemented() calls are in the 
suspend(), resume(), interrupt(), and terminate() methods, which do not seem 
difficult to implement. Beyond that, there are three fatalError() calls in the 
source file, which would need to be replaced with throws. There would also, of 
course, need to be “throws” annotations on the declarations for launch() and 
posix(), and “try” keywords added to the four calls to posix(). All told, not a 
large undertaking.

For backward source compatibility, the existing, non-throwing APIs could be 
provided as well, but deprecated. These could simply call the throwing APIs and 
either call fatalError() or throw an NSException when an error is caught.

I cannot think of too many instances where NSTask objects need to be passed 
around, so bridging to Objective-C is probably not a major concern.

IMPACT ON EXISTING CODE:

Since the new class would have the same name and public API as the existing 
Process (NSTask) class, this would not break source compatibility. It would 
break binary compatibility, which makes it a consideration for Swift 4.

Charles

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to