[swift-evolution] Catching NSException

Joe Groff jgroff at apple.com
Thu Mar 24 13:45:06 CDT 2016

> On Mar 24, 2016, at 11:06 AM, Jon Brooks via swift-evolution <swift-evolution at swift.org> wrote:
> Apologies if this has come up before - I've fallen behind in following this list.
> I recently ran into an issue where I needed to be able to catch NSExceptions raised by Objective C API in Swift, and found no good way to do that.  Currently the only possible way is to via Objective C code that wraps the call in an Objective C style @try/@catch block.  If building a swift framework, this means a separate module, since we can't use bridging headers.
> My quick attempt at a workaround can be seen here: https://github.com/jonbrooks/ObjCTryCatch <https://github.com/jonbrooks/ObjCTryCatch> and there are other workarounds out there too.  I wondered if there has been any discussion to building something like this into swift directly.  I don't really have any good ideas, but maybe something like
>     do {
>         objc_try someObjectiveCInstance.methodThatMightRaiseException()
>     } catch {
>         //error would be an ErrorType that contains info about the exception raised, or the exception itself?
>     }
> Any thoughts?

Catching ObjC exceptions is problematic, since Cocoa generally only uses exceptions for unrecoverable programmer error situations, and most ObjC code does not attempt to clean up resources or maintain invariants in response to exceptions unwinding through it. Generally the best answer is restructure your code not to cause the exception to be thrown in the first place. There are unfortunately some APIs for which that's not possible, but if you must handle ObjC exceptions, I'd recommend doing so from ObjC code rather than from Swift.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160324/332bc223/attachment.html>

More information about the swift-evolution mailing list