Repository: incubator-weex Updated Branches: refs/heads/release-0.16 65c0910d2 -> febb72075
* [ios] add jserror upload method, add trigger positions on sdk init,jsservice,jsbridge Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/e3b9c10e Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/e3b9c10e Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/e3b9c10e Branch: refs/heads/release-0.16 Commit: e3b9c10ee99b3c6236f5e67867b634fd3377d7e6 Parents: db5b1e0 Author: gurisxie <279483...@qq.com> Authored: Thu Oct 19 11:45:16 2017 +0800 Committer: gurisxie <279483...@qq.com> Committed: Thu Oct 19 11:45:16 2017 +0800 ---------------------------------------------------------------------- ios/sdk/WeexSDK.xcodeproj/project.pbxproj | 12 +++++ .../WeexSDK/Sources/Bridge/WXBridgeContext.m | 13 +++-- ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m | 16 +++--- ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m | 5 +- ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h | 6 +++ .../WeexSDK/Sources/Monitor/WXExceptionUtils.h | 29 ++++++++++ .../WeexSDK/Sources/Monitor/WXExceptionUtils.m | 57 ++++++++++++++++++++ ios/sdk/WeexSDK/Sources/WeexSDK.h | 1 + 8 files changed, 128 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e3b9c10e/ios/sdk/WeexSDK.xcodeproj/project.pbxproj ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj index 8addaca..749cb8c 100644 --- a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj +++ b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj @@ -264,6 +264,10 @@ 77E65A161C155EB5008B8775 /* WXTextComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = 77E65A141C155EB5008B8775 /* WXTextComponent.m */; }; 77E65A191C155F25008B8775 /* WXScrollerComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 77E65A171C155F25008B8775 /* WXScrollerComponent.h */; settings = {ATTRIBUTES = (Public, ); }; }; 77E65A1A1C155F25008B8775 /* WXScrollerComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = 77E65A181C155F25008B8775 /* WXScrollerComponent.m */; }; + 841CD1031F9739890081196D /* WXExceptionUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 841CD1021F9739890081196D /* WXExceptionUtils.m */; }; + 841CD1051F974DFA0081196D /* WXExceptionUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 841CD1041F97399C0081196D /* WXExceptionUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 841CD1061F974DFA0081196D /* WXExceptionUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 841CD1041F97399C0081196D /* WXExceptionUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 841CD1071F974E000081196D /* WXExceptionUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 841CD1021F9739890081196D /* WXExceptionUtils.m */; }; C401945E1E344E8300D19C31 /* WXFloatCompareTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C401945D1E344E8300D19C31 /* WXFloatCompareTests.m */; }; C41E1A971DC1FD15009C7F90 /* WXDatePickerManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C41E1A951DC1FD15009C7F90 /* WXDatePickerManager.h */; }; C41E1A981DC1FD15009C7F90 /* WXDatePickerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C41E1A961DC1FD15009C7F90 /* WXDatePickerManager.m */; }; @@ -851,6 +855,8 @@ 77E65A141C155EB5008B8775 /* WXTextComponent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXTextComponent.m; sourceTree = "<group>"; }; 77E65A171C155F25008B8775 /* WXScrollerComponent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXScrollerComponent.h; sourceTree = "<group>"; }; 77E65A181C155F25008B8775 /* WXScrollerComponent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXScrollerComponent.m; sourceTree = "<group>"; }; + 841CD1021F9739890081196D /* WXExceptionUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXExceptionUtils.m; sourceTree = "<group>"; }; + 841CD1041F97399C0081196D /* WXExceptionUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WXExceptionUtils.h; sourceTree = "<group>"; }; C401945D1E344E8300D19C31 /* WXFloatCompareTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXFloatCompareTests.m; sourceTree = "<group>"; }; C41E1A951DC1FD15009C7F90 /* WXDatePickerManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXDatePickerManager.h; sourceTree = "<group>"; }; C41E1A961DC1FD15009C7F90 /* WXDatePickerManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXDatePickerManager.m; sourceTree = "<group>"; }; @@ -1082,6 +1088,8 @@ 2AAFC1B41C48DFF70026D2FE /* WXSDKError.h */, 749DC2791D40827B009E1C91 /* WXMonitor.h */, 749DC27A1D40827B009E1C91 /* WXMonitor.m */, + 841CD1041F97399C0081196D /* WXExceptionUtils.h */, + 841CD1021F9739890081196D /* WXExceptionUtils.m */, ); name = Monitor; path = WeexSDK/Sources/Monitor; @@ -1602,6 +1610,7 @@ DCA0EF641D6EED6F00CB18B9 /* WXGlobalEventModule.h in Headers */, 2A837AB21CD9DE9200AEDF03 /* WXLoadingComponent.h in Headers */, DCA446271EFA5DAF00D0CFA8 /* WeexSDK.h in Headers */, + 841CD1051F974DFA0081196D /* WXExceptionUtils.h in Headers */, C42E8F9B1F39DF07001EBE9D /* WXTracingProtocol.h in Headers */, 7423899F1C32733800D748CA /* WXType.h in Headers */, 59A582FC1CF5B17B0081FD3E /* WXBridgeContext.h in Headers */, @@ -1793,6 +1802,7 @@ DCA445D51EFA598200D0CFA8 /* WXComponent+PseudoClassManagement.h in Headers */, DCA4460E1EFA5A7E00D0CFA8 /* WXLength.h in Headers */, DCA445FA1EFA5A3A00D0CFA8 /* WXNavigatorModule.h in Headers */, + 841CD1061F974DFA0081196D /* WXExceptionUtils.h in Headers */, DCA446081EFA5A6A00D0CFA8 /* NSArray+Weex.h in Headers */, 74B81AE51F73C3E900D3A61D /* WXRecycleListDataManager.h in Headers */, DCA445F21EFA5A2300D0CFA8 /* WXHeaderComponent.h in Headers */, @@ -2200,6 +2210,7 @@ 7463192A1C71B92600EFEBD4 /* WXModalUIModule.m in Sources */, 77D161501C02E3880010B15B /* WXUtility.m in Sources */, 74A4BA9F1CB3C0A100195969 /* WXHandlerFactory.m in Sources */, + 841CD1031F9739890081196D /* WXExceptionUtils.m in Sources */, C4E97D341F1EF46D00ABC314 /* WXTracingManager.m in Sources */, 742AD72F1DF98C45007DC46C /* WXResourceRequest.m in Sources */, 7461F8931CFB373100F62D44 /* WXLayer.m in Sources */, @@ -2278,6 +2289,7 @@ DCA4455E1EFA55B300D0CFA8 /* WXFooterComponent.m in Sources */, DCA4455F1EFA55B300D0CFA8 /* WXNavigationDefaultImpl.m in Sources */, 74B81AF21F73C3E900D3A61D /* WXJSASTParser.mm in Sources */, + 841CD1071F974E000081196D /* WXExceptionUtils.m in Sources */, DCA445601EFA55B300D0CFA8 /* WXURLRewriteDefaultImpl.m in Sources */, DCA445611EFA55B300D0CFA8 /* WXPrerenderManager.m in Sources */, DCA445631EFA55B300D0CFA8 /* WXPickerModule.m in Sources */, http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e3b9c10e/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m index 7985fe5..24801cc 100644 --- a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m +++ b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m @@ -40,6 +40,7 @@ #import "WXSDKInstance_private.h" #import "WXPrerenderManager.h" #import "WXTracingManager.h" +#import "WXExceptionUtils.h" #define SuppressPerformSelectorLeakWarning(Stuff) \ do { \ @@ -506,8 +507,10 @@ _Pragma("clang diagnostic pop") \ WX_MONITOR_PERF_END(WXPTFrameworkExecute); if ([self.jsBridge exception]) { - NSString *message = [NSString stringWithFormat:@"JSFramework executes error: %@", [self.jsBridge exception]]; - WX_MONITOR_FAIL(WXMTJSFramework, WX_ERR_JSFRAMEWORK_EXECUTE, message); + NSString *exception = [[self.jsBridge exception] toString]; + NSMutableString *errMsg = [NSMutableString stringWithFormat:@"[WX_KEY_EXCEPTION_SDK_INIT_JSFM_INIT_FAILED] %@",exception]; + [WXExceptionUtils commitCriticalExceptionRT:@"WX_KEY_EXCEPTION_SDK_INIT" errCode:[NSString stringWithFormat:@"%d", WX_KEY_EXCEPTION_SDK_INIT] function:@"" exception:errMsg extParams:nil]; + WX_MONITOR_FAIL(WXMTJSFramework, WX_ERR_JSFRAMEWORK_EXECUTE, errMsg); } else { WX_MONITOR_SUCCESS(WXMTJSFramework); //the JSFramework has been load successfully. @@ -568,8 +571,10 @@ _Pragma("clang diagnostic pop") \ [self.jsBridge executeJavascript:script]; if ([self.jsBridge exception]) { - NSString *message = [NSString stringWithFormat:@"JSService executes error: %@", [self.jsBridge exception]]; - WX_MONITOR_FAIL(WXMTJSService, WX_ERR_JSFRAMEWORK_EXECUTE, message); + NSString *exception = [[self.jsBridge exception] toString]; + NSMutableString *errMsg = [NSMutableString stringWithFormat:@"[WX_KEY_EXCEPTION_INVOKE_JSSERVICE_EXECUTE] %@",exception]; + [WXExceptionUtils commitCriticalExceptionRT:@"WX_KEY_EXCEPTION_INVOKE" errCode:[NSString stringWithFormat:@"%d", WX_KEY_EXCEPTION_INVOKE] function:@"" exception:errMsg extParams:nil]; + WX_MONITOR_FAIL(WXMTJSService, WX_ERR_JSFRAMEWORK_EXECUTE, errMsg); } else { // success } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e3b9c10e/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m b/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m index ec81b22..f076817 100644 --- a/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m +++ b/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m @@ -36,6 +36,7 @@ #import "WXSDKManager.h" #import "WXExtendCallNativeManager.h" #import "WXTracingManager.h" +#import "WXExceptionUtils.h" #import <dlfcn.h> @@ -154,14 +155,17 @@ _jsContext.exceptionHandler = ^(JSContext *context, JSValue *exception){ context.exception = exception; - NSString *message = [NSString stringWithFormat:@"[%@:%@:%@] %@\n%@", exception[@"sourceURL"], exception[@"line"], exception[@"column"], exception, [exception[@"stack"] toObject]]; - id<WXJSExceptionProtocol> jsExceptionHandler = [WXHandlerFactory handlerForProtocol:@protocol(WXJSExceptionProtocol)]; WXSDKInstance *instance = [WXSDKEngine topInstance]; - WXJSExceptionInfo * jsExceptionInfo = [[WXJSExceptionInfo alloc] initWithInstanceId:instance.instanceId bundleUrl:[instance.scriptURL absoluteString] errorCode:[NSString stringWithFormat:@"%d", WX_ERR_JS_EXECUTE] functionName:@"" exception:[NSString stringWithFormat:@"[%@:%@] %@\n%@ \njsMainBundleStringContentLength:%@\njsMainBundleStringContentMd5:%@",exception[@"line"], exception[@"column"],[exception toString], exception[@"stack"], instance.userInfo[@"jsMainBundleStringContentLength"]?:@"",instance.userInfo[@"jsMainBundleStringContentMd5"]?:@""] userInfo:nil]; - if ([jsExceptionHandler respondsToSelector:@selector(onJSException:)]) { - [jsExceptionHandler onJSException:jsExceptionInfo]; - } + NSString *bundleUrl = [instance.scriptURL absoluteString]?:@"WX_KEY_EXCEPTION_WXBRIDGE"; + NSString *errorCode = [NSString stringWithFormat:@"%d", WX_KEY_EXCEPTION_WXBRIDGE]; + NSString *message = [NSString stringWithFormat:@"[WX_KEY_EXCEPTION_WXBRIDGE] [%@:%@:%@] %@\n%@", exception[@"sourceURL"], exception[@"line"], exception[@"column"], [exception toString], [exception[@"stack"] toObject]]; + NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys: + instance.userInfo[@"jsMainBundleStringContentLength"]?:@"",@"jsMainBundleStringContentLength", + instance.userInfo[@"jsMainBundleStringContentMd5"]?:@"",@"jsMainBundleStringContentMd5",nil]; + WXJSExceptionInfo * jsExceptionInfo = [[WXJSExceptionInfo alloc] initWithInstanceId:instance.instanceId bundleUrl:bundleUrl errorCode:errorCode functionName:@"" exception:message userInfo:userInfo]; + + [WXExceptionUtils commitCriticalExceptionRT:jsExceptionInfo]; WX_MONITOR_FAIL(WXMTJSBridge, WX_ERR_JS_EXECUTE, message); if (instance.onJSRuntimeException) { instance.onJSRuntimeException(jsExceptionInfo); http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e3b9c10e/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m b/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m index e86221d..fbd62b9 100644 --- a/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m +++ b/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m @@ -37,6 +37,7 @@ #import "WXLog.h" #import "WXUtility.h" #import "WXExtendCallNativeManager.h" +#import "WXExceptionUtils.h" @implementation WXSDKEngine @@ -230,7 +231,9 @@ WX_MONITOR_PERF_START(WXPTInitalizeSync) if (!script || script.length <= 0) { - WX_MONITOR_FAIL(WXMTJSFramework, WX_ERR_JSFRAMEWORK_LOAD, @"framework loading is failure!"); + NSMutableString *errMsg = [NSMutableString stringWithFormat:@"[WX_KEY_EXCEPTION_SDK_INIT_JSFM_INIT_FAILED] script don't exist:%@",script]; + [WXExceptionUtils commitCriticalExceptionRT:@"WX_KEY_EXCEPTION_SDK_INIT" errCode:[NSString stringWithFormat:@"%d", WX_KEY_EXCEPTION_SDK_INIT] function:@"initSDKEnvironment" exception:errMsg extParams:nil]; + WX_MONITOR_FAIL(WXMTJSFramework, WX_ERR_JSFRAMEWORK_LOAD, errMsg); return; } static dispatch_once_t onceToken; http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e3b9c10e/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h b/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h index 38b1e2b..e47cb1c 100644 --- a/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h +++ b/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h @@ -51,5 +51,11 @@ typedef NS_ENUM(int, WXSDKErrCode) WX_ERR_NOT_CONNECTED_TO_INTERNET = -2205, WX_ERR_CANCEL = -2204, WX_ERR_DOWNLOAD_END = -2299, + + WX_KEY_EXCEPTION_SDK_INIT = -9000, + WX_KEY_EXCEPTION_INVOKE = -9100, + WX_KEY_EXCEPTION_JS_DOWNLOAD =-9200, + WX_KEY_EXCEPTION_DOM = -9300, + WX_KEY_EXCEPTION_WXBRIDGE=-9400, }; http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e3b9c10e/ios/sdk/WeexSDK/Sources/Monitor/WXExceptionUtils.h ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Monitor/WXExceptionUtils.h b/ios/sdk/WeexSDK/Sources/Monitor/WXExceptionUtils.h new file mode 100644 index 0000000..c0bcf4b --- /dev/null +++ b/ios/sdk/WeexSDK/Sources/Monitor/WXExceptionUtils.h @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#import <Foundation/Foundation.h> +#import "WXJSExceptionInfo.h" + +@interface WXExceptionUtils : NSObject + ++ (void)commitCriticalExceptionRT:(NSString *)instanceId errCode:(NSString *)errCode function:(NSString *)function exception:(NSString *)exception extParams:(NSDictionary *)extParams; + ++ (void)commitCriticalExceptionRT:(WXJSExceptionInfo*)jsExceptionInfo; +@end + http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e3b9c10e/ios/sdk/WeexSDK/Sources/Monitor/WXExceptionUtils.m ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Monitor/WXExceptionUtils.m b/ios/sdk/WeexSDK/Sources/Monitor/WXExceptionUtils.m new file mode 100644 index 0000000..0ed7297 --- /dev/null +++ b/ios/sdk/WeexSDK/Sources/Monitor/WXExceptionUtils.m @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#import "WXExceptionUtils.h" +#import "WXJSExceptionProtocol.h" +#import "WXHandlerFactory.h" +#import "WXSDKEngine.h" +#import "WXSDKError.h" +#import "WXJSExceptionInfo.h" +#import "WXUtility.h" +#import "WXSDKManager.h" + + +@implementation WXExceptionUtils + ++ (void)commitCriticalExceptionRT:(NSString *)instanceId errCode:(NSString *)errCode function:(NSString *)function exception:(NSString *)exception extParams:(NSDictionary *)extParams{ + NSString *bundleUrlCommit = @"BundleUrlDefault"; + NSString *instanceIdCommit = @"InstanceIdDefalut"; + + if(![WXUtility isBlankString:instanceId]){ + instanceIdCommit = instanceId; + WXSDKInstance * instance = [WXSDKManager instanceForID:instanceId]; + if(instance){ + bundleUrlCommit = [instance.scriptURL absoluteString]?:bundleUrlCommit; + }else if([instanceIdCommit hasPrefix:@"WX_KEY_EXCEPTION"]){ + bundleUrlCommit = instanceId; + } + } + + WXJSExceptionInfo * jsExceptionInfo = [[WXJSExceptionInfo alloc] initWithInstanceId:instanceIdCommit bundleUrl:bundleUrlCommit errorCode:errCode functionName:function exception:exception userInfo: [extParams mutableCopy]]; + [WXExceptionUtils commitCriticalExceptionRT:jsExceptionInfo]; +} + ++ (void)commitCriticalExceptionRT:(WXJSExceptionInfo *)jsExceptionInfo{ + id<WXJSExceptionProtocol> jsExceptionHandler = [WXHandlerFactory handlerForProtocol:@protocol(WXJSExceptionProtocol)]; + if ([jsExceptionHandler respondsToSelector:@selector(onJSException:)]) { + [jsExceptionHandler onJSException:jsExceptionInfo]; + } +} + +@end http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e3b9c10e/ios/sdk/WeexSDK/Sources/WeexSDK.h ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/WeexSDK.h b/ios/sdk/WeexSDK/Sources/WeexSDK.h index 3bbc3ea..562cfa8 100644 --- a/ios/sdk/WeexSDK/Sources/WeexSDK.h +++ b/ios/sdk/WeexSDK/Sources/WeexSDK.h @@ -53,6 +53,7 @@ #import "WXIndicatorComponent.h" #import "WXImgLoaderProtocol.h" #import "WXExtendCallNativeProtocol.h" +#import "WXExceptionUtils.h" #import "WXEventModuleProtocol.h" #import "WXErrorView.h" #import "WXDefine.h"