beeware / beeware/rubicon-objc
Objective-C exception handling support
- Dominant language
- Python
- Stars
- 301
- Forks
- 70
- Avg merge
- 1d 8h
- Merged PRs (30d)
- 18
Description
This one is a bit tricky. On all modern architectures, Objective-C exceptions are implemented using [libunwind](http://www.nongnu.org/libunwind/), the same system as C++ exceptions. Unfortunately it's not possible to handle these exceptions using only `ctypes`. We would need a small C helper function, something like `bool callAndCatchException(void *(*func)(void *), void **outRetval, id *outException)` that calls the function pointer, catches any exception that comes out, and reports success/failure as well as the return value or exception.
The other question is how we should expose Objective-C exceptions on the Python side. Should we route every Objective-C method call through our helper function, and automatically wrap any Objective-C exceptions in Python exceptions? Or should we provide an extra function to allow the user to do this on demand? I would be in favor of the latter option, because using `callAndCatchException` adds extra overhead even when no exceptions are caught (not just the call, but also the creation of the wrapper `func`). There's also not that much benefit in converting Objective-C exceptions to Python exceptions if they won't be handled anyway - in fact it's probably more useful *not* to convert them, to get a proper crash report with the native stack trace and debugging info.
Contributor guide
Assessment
This issue has not been assessed yet.