如何在JS中写OC的try-catch来捕获OC中的异常
我们最近遇到了一个故障,最简单修复方法是捕获并忽略异常。看了一下发现 JSPatch 并不支持处理异常,于是尝试自己添加一下。
第一个想法是写一个 extension,做到类似这样的效果:
defineClass('JPViewController', {
handleBtn: function(sender) {
ignoreException(function() {
self.ORIGhandleBtn(null);
});
}
})
Extension 是这样写的:
@implementation SALExceptionExtension
+ (void)main:(JSContext *)context
{
context[@"ignoreException"] = ^void(JSValue *func) {
@try {
[func callWithArguments:nil];
}
@catch (NSException *exception) {
// Just ignore it
}
};
}
@end
但是发现 exception 还是捕获不了,调用栈如下:

JSViewController 中的异常并不会被扩展中的 try-catch 捕获到,猜测可能是因为调用栈中间的 JSC 的代码引起的。验证了一下,在 callSelector 中加入 try-catch 就可以正确地捕获异常了。
为什么 JSC 的代码会影响异常的展开?
如果这个问题能够解决的话那么就可以比较好地处理异常了,如果不行的话,可以在 callSelector 中捕获 OC 代码中的所有异常。
但是这样的问题是,
- OC 调用中发生异常之后的代码不会被执行,这可能不是预期的结果
- 忽略所有异常可能不是预期的结果
不知道 @bang590 怎么看这个问题?
我也不清楚为什么会catch不到异常,待研究 其实就算能catch到,也不建议这样的用法,正如你说的,不是预期的效果
给NSException类加category 置换raise方法可以捕获吗?
参考下这个:http://www.jianshu.com/p/c7e503c6b29a
@leafduo 你现在怎么解决这个问题。 我也遇到了
@wengxianxun 没有解决
@fingerplay 这种方法也是只能捕获所有的异常,而且还不只是 JSPatch 包裹的代码的异常,而是整个 app 里面所有的异常
@leafduo 我换了一种做法, trycatch写在oc中, try中的代码另写一个方法转成js
@wengxianxun 这样只能预埋一些 try-catch 吧?