JSPatch icon indicating copy to clipboard operation
JSPatch copied to clipboard

如何在JS中写OC的try-catch来捕获OC中的异常

Open sgeniusd opened this issue 9 years ago • 9 comments

sgeniusd avatar Jan 04 '16 07:01 sgeniusd

我们最近遇到了一个故障,最简单修复方法是捕获并忽略异常。看了一下发现 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 还是捕获不了,调用栈如下: image

JSViewController 中的异常并不会被扩展中的 try-catch 捕获到,猜测可能是因为调用栈中间的 JSC 的代码引起的。验证了一下,在 callSelector 中加入 try-catch 就可以正确地捕获异常了。

为什么 JSC 的代码会影响异常的展开?

如果这个问题能够解决的话那么就可以比较好地处理异常了,如果不行的话,可以在 callSelector 中捕获 OC 代码中的所有异常。

但是这样的问题是,

  1. OC 调用中发生异常之后的代码不会被执行,这可能不是预期的结果
  2. 忽略所有异常可能不是预期的结果

不知道 @bang590 怎么看这个问题?

leafduo avatar Jan 09 '16 09:01 leafduo

我也不清楚为什么会catch不到异常,待研究 其实就算能catch到,也不建议这样的用法,正如你说的,不是预期的效果

bang590 avatar Feb 03 '16 13:02 bang590

给NSException类加category 置换raise方法可以捕获吗?

fingerplay avatar Mar 28 '16 10:03 fingerplay

参考下这个:http://www.jianshu.com/p/c7e503c6b29a

fingerplay avatar Mar 28 '16 10:03 fingerplay

@leafduo 你现在怎么解决这个问题。 我也遇到了

wengxianxun avatar May 23 '16 06:05 wengxianxun

@wengxianxun 没有解决

leafduo avatar May 23 '16 08:05 leafduo

@fingerplay 这种方法也是只能捕获所有的异常,而且还不只是 JSPatch 包裹的代码的异常,而是整个 app 里面所有的异常

leafduo avatar May 23 '16 08:05 leafduo

@leafduo 我换了一种做法, trycatch写在oc中, try中的代码另写一个方法转成js

wengxianxun avatar May 23 '16 09:05 wengxianxun

@wengxianxun 这样只能预埋一些 try-catch 吧?

leafduo avatar May 24 '16 07:05 leafduo