Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 捕获主目录中的NSException_Ios_Objective C_Nsexception - Fatal编程技术网

Ios 捕获主目录中的NSException

Ios 捕获主目录中的NSException,ios,objective-c,nsexception,Ios,Objective C,Nsexception,我接手的iOS应用程序处理NSException的方式与我以前看到的不同,我想知道为什么它现在不能工作 在main.m文件中,老开发人员有以下逻辑: int main(int argc, char *argv[]) { @autoreleasepool { int retVal = 0; @try { retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([Ap

我接手的iOS应用程序处理NSException的方式与我以前看到的不同,我想知道为什么它现在不能工作

在main.m文件中,老开发人员有以下逻辑:

int main(int argc, char *argv[])
{
    @autoreleasepool {
        int retVal = 0;
        @try {
            retVal =  UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        }
        @catch (NSException *exception) {
            //
            //Logic to save Exception in DataStore
            //
            NSLog(@"Exception - %@",[exception description]);
            exit(EXIT_FAILURE);
        }
        return retVal;
    }
}
当应用程序再次启动时,您将收到一条提示,向我们发送异常,如果您确认,它将发送到我们的服务器

我最近推出了一个针对iOS 7更优化的应用程序更新,并注意到我再也没有从崩溃的应用程序中获得任何这些错误报告

因此,我通过以下代码对其进行了测试,我知道这些代码会被调用:

NSArray *array = [NSArray new];

id object = [array objectAtIndex:4];
我收到此信:

2014-05-12 14:55:57.575 APPNAME[17989:60b] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 4 beyond bounds for empty array'
*** First throw call stack:
(0x18ab0b09c 0x196a89d78 0x18aa0c680 0x10007f498 0x18d9e02c0 0x18da997d0 0x18da996cc 0x18da98ba0
 0x18da98840 0x18da98564 0x18da984e4 0x18d9dad78 0x18d5d70cc 0x18d5d1c94 0x18d5d1b4c 
 0x18d5d13d4 0x18d5d1178 0x18d5caa30 0x18aacb7e0 0x18aac8a68 0x18aac8df4 0x18aa09b38 
 0x19042f830 0x18da480e8 0x100036b98 0x197073aa0)
libc++abi.dylib: terminating with uncaught exception of type NSException
正如您所看到的,异常没有被记录或保存,而是完全未被捕获

2个问题:

  • 这是坏习惯吗?我不认为是这样,但我是一个jr开发人员,不确定是否有更好的方法来做这个w/o第三方服务

  • 你知道iOS 7中有什么变化会影响这种(未触及的)逻辑吗

  • 这是坏习惯吗?我不认为是,但我是一个jr的开发人员和 不太确定是否有更好的方法来完成这项工作,不需要第三次 派对服务

    是的,这是个坏习惯
    UIApplicationMain()
    是一个黑洞;一旦将控件传递给该函数,就不太可能再次调用
    main()
    中该调用之外的任何代码

    这也是一个幼稚的实现;它向stdout记录的信息比正常的异常处理机制(即您看到的输出)要少。它隐藏了对调试有用的信息,也可能绕过标准崩溃报告机制

    请注意,还有一个全局未处理异常处理挂钩。我不建议使用它,但它确实存在

    您是否知道iOS 7中有任何会影响此功能的更改(未触及) 逻辑

    不是马上,但我还没看过。不过,
    UIApplicationMain()
    还是一个黑洞;它通常永远不会返回。

    根据您的需要,您可以使用NSSetUncaughtExceptionHandler函数来处理未捕获的异常。请尝试以下代码:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        NSSetUncaughtExceptionHandler(handleUncaughtException);
        @throw [NSException exceptionWithName:NSGenericException
                                       reason:@"Test uncaught exception handling"
                                     userInfo:nil];
    
        return YES;
    }
    
    void handleUncaughtException(NSException *exception)
    {
        NSLog(@"Exception - %@",[exception description]);
        exit(EXIT_FAILURE);
    }
    

    我猜苹果现在在
    UIApplicationMain
    UIApplication
    classis的某个地方有一个异常处理程序,我把这个标记为正确答案,因为在我问了这个问题之后,我找到了这个确切的答案,它成功了。但我有一个问题,这是否是一个好的做法?我认为这是一个好的做法,但我想我们应该请@bbum解释为什么他建议不要使用itI。我感谢你给出的答案。我明白这是多么糟糕的做法,因为它依赖于uIApplicationMain。日志因素不是问题,因为我们的异常处理dao和报告类保存了大量数据,并且还包括我们发送的面包屑。似乎iOS 7可能已经改变了它返回的方式,因为在iOS 7之前,它们都被报告了。