如何在iPhone应用程序中执行应用程序级异常处理

时间:2009-06-11 09:04:09

标签: iphone exception-handling

我正在开发一个应用程序来进行一些图像处理。如果出现问题,应用程序崩溃了。我想避免这种情况。当应用程序的任何阶段发生任何异常时,我想处理它并给用户一个友好的消息。在C#中,windows form应用程序可以完成,但对于iPhone我是新的,因此不知道如何实现它。

任何身体都可以帮助我。

谢谢

Ashwani

3 个答案:

答案 0 :(得分:5)

您可以实现符合此签名的未捕获异常处理程序:

typedef volatile void NSUncaughtExceptionHandler(NSException *exception);

通过调用NSSetUncaughtExceptionHandler函数。从那里你可以弹出任何你想要通知用户应用程序正在关闭的UI(我们实际上收集一个堆栈跟踪并调用mailto:url将崩溃发送给我们 - 这已经过时了,因为iTunes 8.2是自动的崩溃报告)。

编辑: 要清楚,您的应用在您的处理程序完成后终止,没有办法绕过它。我不确定为什么你会希望你的应用程序在此时继续执行,因为它很可能处于不一致的状态。让它崩溃而不是潜在地破坏数据或更糟糕的情况几乎总是更好。来自Apple文档:

  

设置顶级错误处理   功能你可以执行的功能   程序前的最后一分钟记录   的终止

答案 1 :(得分:1)

@try {
  //Code on which you want to put the check
}
@catch (NSException *exception){
  //This finds out which kind of exception it is.
  NSLog(@"main: Caught %@: %@", [exception name], [exception reason]);
}
@finally {
  //This piece of code executes no matter whether an exception occured or not.
}

更多详情:Exception Handling in Iphone

答案 2 :(得分:1)

void UncaughtExceptionHandler(NSException *exception)
{
   @try
{
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"App Committed Suicide"
                                                    message:@"Oh dear, that wasn't supposed to happen. You will have to restart the application... sorry!"
                                                   delegate:[[UIApplication sharedApplication] delegate] cancelButtonTitle:nil otherButtonTitles:@"That's ok!", @"Erm, bye...", nil];
    [alert show];
    [alert release];
    while (exceptionAlertDismissed == FALSE)
    {
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
    }
}
@catch (NSException *exception)
{

}
@finally
{
    @throw exception;
}
}  

上面的方法是 NSSetUncaughtExceptionHandler 的委托方法,它是一个捕获异常的类,  在appDelegate类.m文件中编写上述方法并添加语句 NSSetUncaughtExceptionHandler(& UncaughtExceptionHandler); in    didFinishLaunchingWithOptions 方法
在您的视图控制器中发生的上述委托方法的任何异常都将被调用并显示警报消息。

谢谢