NodObjC
The NodeJS ⇆ Objective-C Bridge
Exception
NodObjC
makes it seamless to catch Objective-C exceptions, using the standard
JavaScript try
/catch
syntax you are already familiar with.
When an Objective-C method or function throws an NSException
, you can catch
the exception and inspect it further. The error object that gets passed can be
invoked to send messages, just like any other Objective-C object in NodObjC
.
The error object also has it's message
and stack
properties set, so that
you can easily retrieve the error message and get a dump of the stack trace.
var array = $.NSMutableArray('alloc')('init')
try {
// This will throw an exception since you can't add a null pointer
array('addObject', null)
} catch (err) {
err('name')
// 'NSInvalidArgumentException'
err('reason')
// '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
err('reason') == err.message
// true
err.stack
// NSInvalidArgumentException: *** -[__NSArrayM insertObject:atIndex:]: object cannot be nil
// at Function.msgSend (/Users/nrajlich/NodObjC/lib/id.js:139:21)
// at id (/Users/nrajlich/NodObjC/lib/id.js:105:15)
// at Object.<anonymous> (/Users/nrajlich/NodObjC/array-exception.js:8:3)
// at Module._compile (module.js:411:26)
// at Object..js (module.js:417:10)
// at Module.load (module.js:343:31)
// at Function._load (module.js:302:12)
// at Array.0 (module.js:430:10)
// at EventEmitter._tickCallback (node.js:126:26)
}
wrap()
This is a private function used internally by
NodObjC
. You should not need to use this function in
your code.Wraps a Pointer
that should be an Objective-C NSException
instance.
function wrap (pointer) {
var w = id.wrap(pointer)
w.__proto__ = proto
// `name` is non-configurable on Functions, so don't bother
w.message = String(w('reason'))
Error.captureStackTrace(w, wrap)
return w
}
Exception#toString()
A toString()
override that mimics an Error
object's toString()
,
using the equivalent Objective-C NSException
instance methods.
// `err` is a caught NSException instance
err.toString()
// 'NSInvalidArgumentException: *** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
proto.toString = function toString () {
return this('name') + ': ' + this('reason')
}