On Jan 20, 2010, at 1:27 PM, Paul Sanders wrote:

> I am experiencing a strange problem with the handling of uncaught exceptions 
> which I'm hoping someone can shed some light on.
> 
> This document:
> 
> http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/Exceptions/Tasks/ControllingAppResponse.html#//apple_ref/doc/uid/20000473
> 
> states that certain classes of exception will terminate the app if they are 
> not caught.

But the main application loop is documented as catching all exceptions that 
reach it.  One example of the documentation is the note on this page:

http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/Exceptions/Concepts/UncaughtExceptions.html#//apple_ref/doc/uid/20000056


>  But this is not the behaviour I observe.  To take a specific example, 
> executing this code:
> 
>    [NSObject noSuchSelector];
>    foo ();
> 
> Just abruptly returns to the main event loop (and the call to foo (), and 
> whatever follows, is never executed).

Right.  As documented.

>  This is _not_ the behaviour I want.  If I am stupid enough to send a message 
> to an object that doesn't recognise it, I'd like my program to crash (and 
> therefore generate a crash log).  Then, when it restarts, it offers to send 
> the log to me (thank you, Uli M Kusterer).  Otherwise, my app will just 
> behave strangely and I will never even know I have a bug.  Exit one 
> [potential] customer.

I don't know if there's a way to prevent NSApplication from catching exceptions 
in the main event loop.  You can override -reportException: to call abort() or 
the like, but a) somebody here recently reported that their -reportException: 
override wasn't being called on Snow Leopard, and b) the abort() will produce a 
crash report that doesn't show the call stack which generated the original 
exception -- it will show the call stack for the abort() call, which is 
uninteresting.

You can compensate for (b) by logging the actual exception, perhaps with the 
help of NSExceptionHandler to add a stack trace.  Maybe you can hack together 
an override of -[NSApplication run] to get rid of the top-level exception 
handling?

Certainly, you can use NSExecptionHandler to log all exceptions which get 
caught by the top-level exception handler, and then you can send yourself that 
log in lieu of a crash report.

-Ken

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to