On May 14, 2016, at 12:19 AM, Jon Shier via swift-evolution 
<[email protected]> wrote:
> 
> Charles:
>       I appreciate the attempt to minimize a current pain point and I agree 
> on most of your analysis of the current NSError bridging but I think your 
> proposal is fundamentally flawed. By forcing the core error type to have 
> properties from NSError, you’re essentially finalizing what all error types 
> in Swift should look like. Error domains, codes, and info dictionaries are 
> not Swift, and forcing every error produced in Swift to have those properties 
> is a regression from the freedom ErrorType has given us. No native Swift 
> error type I’ve seen so far has chosen to replicate those properties, and for 
> good reason: they are a relic of C which have no place in Swift. There are 
> far better error designs out there. If you want to propose a strong type of 
> error for Swift, go ahead, but it should be thoroughly inspired by Swift, not 
> driven by a desire to ease bridging to NSError.

Nothing is forced at all, any more than they are currently. The thing to 
remember is that ErrorProtocol *already* defines properties for error domains 
and codes:

public protocol ErrorProtocol {
  var _domain: String { get }
  var _code: Int { get }
}

Thus, the statement that no native Swift error type has these properties could 
not be farther from the truth, as in fact, *every* Swift error type has these 
two properties (and several prominent error types in the standard library 
provide specific values for these properties as well; POSIXError and 
NSCocoaError come to mind). The reason many Swift developers haven’t noticed 
this fact is because the properties have default implementations, which means 
that if you don’t have a specific need to override them, you never have to deal 
with them. Adding a userInfo property, which also has a default implementation 
(returning an empty dictionary), will therefore not take away any of the 
freedom of ErrorType, or really cause any difference at all to a developer who 
is not interested in providing userInfo values on his/her errors.

What the proposal will do, on the other hand, is give a lot of that freedom 
*back*. The fact of the matter is that the entire error-reporting mechanism is 
currently based on NSError. If you have a method which can return an error, and 
you want that error to be presentable to the user in a form more expressive 
than “MyApp.MyErrorType error 2”, you currently have only two choices: 1) 
create some home-grown mechanism to convert your errors to NSErrors, and be 
sure to invoke that mechanism when throwing from any method that could 
conceivably be called from Objective-C, or 2) just use NSErrors all the way 
down, foregoing the use of native Swift errors at all. My proposal would allow 
the free and unlimited use of Swift native errors everywhere errors are a 
possibility with no drawbacks, since if an error needed to be made into a 
human-readable form, this would only be a simple matter of defining a userInfo 
property on the error type, even if much later down the line, and would not 
necessitate adding an NSError conversion at every throw-site in the program. 
Indeed, this proposal will actually *remove* a lot of NSError-based thinking 
from the actual code, and localize all such considerations to a relatively 
small area, to such extent as they are needed.

Charles

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

Reply via email to