• cocoa: 异常和错误处理


    本篇对cocoa项目中,错误和异常处理做一些总结。也欢迎大家批评交流。

    对于异常我们经常使用try-catch:

     @try {
            //有可能错误的代码
            @throw expression
        }
        @catch (NSException *exception) {
            //捕获异常
        }
        @finally {
            //最终处理
        }

    这种形式经常用于开发模式下debug,但是从实际操作来看,用的不多(或者说不知道怎么用)。

    我们将错误和异常做了区分:

    错误就是需要用户知道的,用户需要即使作出反应或者只需要知道的

    异常就是会引起程序奔溃或者不能正常运行,或者即使能正常运行但需要及时修正的

    反映到程序上,错误会需要和用户交互,但异常需要尽量的避免。

    在实际中,我们这样处理:

    1. 发生的错误,需要用户反应才能继续操作的,使用NSAlert:

    [NSAlert alertWithMessageText:<#(NSString *)#>
                        defaultButton:<#(NSString *)#>
                      alternateButton:<#(NSString *)#>
                          otherButton:<#(NSString *)#>
            informativeTextWithFormat:<#(NSString *), ...#>]

    2. 发生错误,不影响程序运行,用户也不需要马上反应。可以使用NSAlert,或者:

    [view/window presentError:<#(NSError *)#>
                   modalForWindow:<#(NSWindow *)#>
                         delegate:<#(id)#>
               didPresentSelector:<#(SEL)#>
                      contextInfo:<#(void *)#>]

    这个方法定义在NSResponder中,view/window都可以调用。这种方法还会根据error的响应链逐级传递。

    3.发生了异常,但不至于使程序奔溃等。比如数组越界之类的错误,在Cocoa上并不会使程序奔溃。这里推荐使用cocoa的exception库。

    //要记得添加framework,再import
    #import <ExceptionHandling/ExceptionHandling.h>
    
    
    //在controller类:
    [[NSExceptionHandler defaultExceptionHandler] setExceptionHandlingMask:0x01ff];//mask可根据需要设置
    [[NSExceptionHandler defaultExceptionHandler] setDelegate:self];
    
    //实现delegate:
    - (BOOL)exceptionHandler:(NSExceptionHandler *)sender shouldLogException:(NSException*)exception mask:(unsigned int)mask
    {
        NSLog(@"%s:\n%@",__PRETTY_FUNCTION__, exception);
        // our handling
        return YES;
    }

    这种方法可以捕获任何异常,适于在debug下调试。

    以上就是我们项目中异常和错误处理的经验总结。

    初次开发cocoa,还有很多不明白的地方,非常希望可以得到大家的指点。

  • 相关阅读:
    JQuery Table 合并单元格-解决Bug版本
    SQLServer当数据导入平面文件
    【BZOJ1294】[SCOI2009]围豆豆Bean 射线法+状压DP+SPFA
    【BZOJ3590】[Snoi2013]Quare 状压DP
    【BZOJ4036】[HAOI2015]按位或 FWT
    【BZOJ1502】[NOI2005]月下柠檬树 Simpson积分
    【CF603E】Pastoral Oddities cdq分治+并查集
    【CF891E】Lust 生成函数
    【CF618G】Combining Slimes 概率+矩阵乘法
    【CF633H】Fibonacci-ish II 莫队+线段树
  • 原文地址:https://www.cnblogs.com/scorpiozj/p/3008301.html
Copyright © 2020-2023  润新知