从项目的任何地方抛出异常

时间:2016-11-29 05:21:45

标签: ios objective-c xcode

我想在代码中的任何地方发生异常时显示提醒。

不包含可能引发异常的代码。

每当发生异常时,它都会在主类中显示错误。那可以从那里处理吗?

这是使用以下方式抛出异常的正常方法:

X-Pack

4 个答案:

答案 0 :(得分:8)

但是,我找到了一种有效的解决方法 - 创建自己的异常处理程序(由于其他原因也很有用)。首先,创建一个处理错误并将其输出到控制台的函数(以及您想要用它做的任何其他事情)

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
     {   
        NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
         // Normal launch stuff
     }

接下来,将异常处理程序添加到您的app delegate:

{{1}}

如果这不起作用,那么只有两个可能的原因:

有些东西会覆盖您的NSSetUncaughtExceptionHandler调用(整个应用程序只能有一个处理程序)。例如,某些第三方库设置了自己的uncaughtExceptionHandler。因此,尝试在didFinishLaunchingWithOptions函数的END处设置它(或选择性地禁用第三方库)。或者更好的是,在NSSetUncaughtExceptionHandler上设置一个符号断点,以快速查看谁在调用它。您可能想要做的是修改当前的而不是添加另一个。 您实际上没有遇到异常(例如,EXC_BAD_ACCESS不是例外)

答案 1 :(得分:4)

导航到Xcode中的Breakpoint面板,单击左下角的“加号”按钮添加新的断点,然后执行以下操作:

enter image description here

构建并运行您的项目,Xcode将带您到异常抛出的行。

答案 2 :(得分:4)

如果我正确理解了这个问题,您似乎正在寻找一种好方法来处理代码中可能由用户操作驱动的错误(例如,无效数据,缺少字段)表格等。)。

执行此操作的最佳方法是使用NSError代替NSExceptionNSError通常用于在期望可能出错的不同代码接口之间传递信息,其中NSException对于意外或由开发人员引起的错误更为重要因此,应该在开发过程中处理。

要在代码中的任何位置显示提醒,您可以向App Delegate添加方法,并使用target-action传递错误。这可能是这样的:

@protocol DLErrorPresentation <NSObject>
- (void)showAlertWithError:(NSError*)error sender:(id)sender
@end

- (void)showAlertWithError:(NSError*)error sender:(id)sender {
// Your alert presentation code
}

// In some view controller or view:
NSError* error;
if(![self somethingThatMayError:error]) {
  id<DLErrorPresentation> responder = [self targetForAction:@selector(showAlertWithError:sender:);
  [responder showAlertWithError:error sender:self]
}

为了提供更多背景信息,请参阅Apple关于其文档中的例外情况的内容:

  

您应该保留使用编程异常或意外的运行时错误,例如越界集合访问,尝试改变不可变对象,发送无效消息以及丢失与窗口服务器的连接。在创建应用程序时而不是在运行时,通常会使用异常处理这些类型的错误。

     

而不是异常,错误对象(NSError)和Cocoa错误传递机制是在Cocoa应用程序中传达预期错误的推荐方法。

     

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Exceptions/Exceptions.html#//apple_ref/doc/uid/10000012i

     

虽然在许多编程环境中通常使用异常来控制编程流程或表示错误,但不要在Cocoa和Cocoa Touch应用程序中以这种方式使用异常。相反,您应该使用方法或函数的返回值来指示发生了错误,并在错误对象中提供有关该问题的信息。

     

https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/ExceptionHandling.html#//apple_ref/doc/uid/TP40008195-CH18-SW1

答案 3 :(得分:-2)

我在main.m中添加了异常处理代码。

 int main(int argc, char * argv[]) {
            @try {
                @autoreleasepool {
                 return UIApplicationMain(argc, argv, nil, NSStringFrom

Class([AppDelegate class]));
            }

        } @catch (NSException *exception) {

            NSLog(@"exception");
        }
    }

现在正在工作。