> Unfortunately, the Cocoa APIs needed to display an error object to the user 
> all take NSErrors, and the conversion from other ErrorTypes to NSErrors is 
> not very good; using “as NSError” to convert a MyError will result in 
> something that has all of the associated values removed, and the message 
> displayed to the user will be a cryptic and not particularly user-friendly 
> “MyError error 1” rather than something more descriptive.

I too badly want to be able to control the `userInfo` of an NSError, or at 
least have casting to NSError and back round-trip nicely.

> One can define an “toNSError()” method on one’s own error type that will 
> properly propagate the NSError’s userInfo dictionary such that it will be 
> displayed in a more meaningful way:

This, however, seems like a recipe for boilerplate.

What I would like to see is this:

* `var userInfo: [String: AnyObject] { get }` is added to `ErrorType`, or 
perhaps to a sub-protocol specifically for this purpose. There's a default 
implementation which simply returns `[:]`.

* A type like this exists in the standard library, or perhaps the Foundation 
overlay:

        private class _NSSwiftError: NSError {
                var swiftError: ErrorType
                
                init(swiftError: ErrorType) {
                        self.swiftError = swiftError
                        super.init(domain: swiftError.domain, code: 
swiftError.code, userInfo: swiftError.userInfo)
                }
        }

I don't know if it can actually be private, but it should be invisible to 
developers, and considered an implementation detail. It might also make sense 
to retrieve the `userInfo` from `swiftError` on demand—the exact implementation 
isn't very important here.

* Casting a native Swift error enum to `NSError` actually constructs an 
`_NSSwiftError`. (Bridged error code enums like `NSCocoaError` use `NSError` as 
usual.)

* Casting an `_NSSwiftError` back to `ErrorType` or a native Swift `ErrorType` 
enum pulls the original instance back out of `swiftError`, so all associated 
objects are preserved. (Bridged error code enums just construct a new instance.)

This way, the only code you have to write is a `userInfo` implementation, and 
even that only if you want to do something custom. There's no need to write a 
bunch of code to construct an entire `NSError` instance, or to unpack the 
`userInfo` back into a Swift enum.

-- 
Brent Royal-Gordon
Architechies

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

Reply via email to