Cheers for the clarification. I started assuming there may be a reason when 
changing the guard let on the launch args to use the InvalidArgumentException.

Could this be a position where we may need os checking to cover the regression 
for the moment. It seems odd that the test would pass in CI when an error is 
thrown with a try! but fail on OSX

Sent from my iPhone

> On 13 May 2016, at 20:48, Tony Parker <anthony.par...@apple.com> wrote:
> 
> Hi James,
> 
>> On May 13, 2016, at 12:25 PM, James Lee via swift-corelibs-dev 
>> <swift-corelibs-dev@swift.org> wrote:
>> 
>> Following on from a previous discussion with Tests failing on OSX. I have 
>> been looking into the failures. It seems that one of the earliest failures 
>> is due to an error from a try! within NSTask.launch(). This came in with 
>> this commit: 
>> https://github.com/apple/swift-corelibs-foundation/commit/4c6f04cfcad3d4b06688558021595d06751fc66a
>> 
>> Going by the docs for Foundation - The launch function apparently "Raises an 
>> NSInvalidArgumentException if the launch path has not been set or is invalid 
>> or if it fails to create a process."
>> 
>> https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTask_Class/#//apple_ref/occ/instm/NSTask/launch
>> 
>> My question is, should this be built into the Swift Foundation API? The 
>> documentation for Swift doesn't state that the launch function throws.
>> 
>> With the test that is failing expecting an error, it feels more Swift-y to 
>> have any errors throw explicitly, rather than looking at what the lower 
>> level fills the data with.
>> 
>> But before jumping into doing this, I would rather put it out there and see 
>> what the community feels about this?
> 
> Unfortunately the ‘throws’ syntax in Swift often causes a mixup between two 
> different things, because it flipped the terminology from what all of our 
> documentation and header comments use.
> 
> 1. Cocoa uses exceptions (@throw in ObjC) to indicate programmer errors and 
> they are generally not intended to be recoverable.  Example: passing nil 
> where not expected, passing an invalid argument, failing to meet a 
> precondition of an API.
> 2. Cocoa uses NSError ** to indicate runtime errors that are recoverable or 
> at least presentable to user. Example: out of disk space, name of file 
> already exists.
> 
> The ‘throws’ syntax in Swift is actually for case #2, not #1. In Swift, #1 is 
> fatalError or preconditionFailure. #2 is ‘throw Error’.
> 
> In the case of NSTask, when the documentation says “raises an 
> NSInvalidArgumentException” (#1) then in Swift, that should translate to 
> fatalError or preconditionFailure.
> 
> Hope this helps,
> - Tony
> 
>> Cheers
>> 
>> James
>> _______________________________________________
>> swift-corelibs-dev mailing list
>> swift-corelibs-dev@swift.org
>> https://lists.swift.org/mailman/listinfo/swift-corelibs-dev
> 

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

Reply via email to